Load data

Internal

CN

Read raw

Templates

Merge raw w/ template

14C

Mass


Call:
lm(formula = loss_pct ~ PM + ECO, data = sra.frc.mss.lss.df[-which(sra.frc.mss.lss.df$Probe == 
    "BSpp_comp_2001_18-28"), ])

Residuals:
    Min      1Q  Median      3Q     Max 
-4.1953 -0.9261 -0.4445  0.7965  5.7767 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   4.8136     0.5726   8.406 1.06e-10 ***
PMBS         -0.1405     0.6486  -0.217 0.829539    
PMGR         -2.3959     0.6382  -3.754 0.000507 ***
ECOwf        -1.0117     0.6382  -1.585 0.120098    
ECOrf        -1.7850     0.6394  -2.792 0.007729 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.831 on 44 degrees of freedom
Multiple R-squared:  0.3641,    Adjusted R-squared:  0.3063 
F-statistic: 6.299 on 4 and 44 DF,  p-value: 0.0004255

Interestingly, it appears that AN soils have proportionally LESS minC by mass than do GR or BS soils, significantly so at depth. Why would this be? Possibly because AN soils have higher losses (DOC) during fractionation?

External data

Atmosphere

from C. Rasmussen (’01 C, N; ’09 14C, frc mass, C, N)

calculating Δ14C from fraction modern

Analysis

Misc. functions

Bulk C

2001

2009

2019

Fraction C

C, CN profiles

[[1]]

[[2]]

[[3]]

[[1]]

[[2]]

[[3]]

[[1]]

[[2]]

[[3]]

[[1]]

[[2]]

[[3]]

C distribution

`summarise()` has grouped output by 'PMeco'. You can override using the `.groups` argument.

Fraction 14C

Depth profiles

Spline ’01, ’09

Spline C

converting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to characterconverting IDs from factor to character
[[1]]

[[2]]

[[3]]

Spline 14C

C-weighted 14C spline

14C time series

$`10`

$`20`

$`30`

$`10`

$`20`

$`30`

$emtrends
 PMeco year.trend   SE df lower.CL upper.CL
 ANpp      -6.795 2.07  9   -11.47    -2.12
 ANrf      -1.018 2.07  9    -5.70     3.66
 ANwf      -0.681 2.07  9    -5.36     4.00
 BSpp      -1.842 2.07  9    -6.52     2.84
 BSrf      -2.766 2.07  9    -7.44     1.91
 BSwf      -1.453 2.07  9    -6.13     3.23
 GRpp      -4.189 2.07  9    -8.87     0.49
 GRrf      -0.779 2.07  9    -5.46     3.90
 GRwf      -2.078 2.07  9    -6.76     2.60

Confidence level used: 0.95 

$contrasts
 contrast    estimate   SE df t.ratio p.value
 ANpp - ANrf  -5.7768 2.92  9 -1.975  0.5893 
 ANpp - ANwf  -6.1137 2.92  9 -2.090  0.5287 
 ANpp - BSpp  -4.9532 2.92  9 -1.694  0.7388 
 ANpp - BSrf  -4.0290 2.92  9 -1.378  0.8815 
 ANpp - BSwf  -5.3424 2.92  9 -1.827  0.6689 
 ANpp - GRpp  -2.6063 2.92  9 -0.891  0.9879 
 ANpp - GRrf  -6.0161 2.92  9 -2.057  0.5460 
 ANpp - GRwf  -4.7170 2.92  9 -1.613  0.7792 
 ANrf - ANwf  -0.3370 2.92  9 -0.115  1.0000 
 ANrf - BSpp   0.8235 2.92  9  0.282  1.0000 
 ANrf - BSrf   1.7477 2.92  9  0.598  0.9991 
 ANrf - BSwf   0.4344 2.92  9  0.149  1.0000 
 ANrf - GRpp   3.1704 2.92  9  1.084  0.9630 
 ANrf - GRrf  -0.2394 2.92  9 -0.082  1.0000 
 ANrf - GRwf   1.0598 2.92  9  0.362  1.0000 
 ANwf - BSpp   1.1605 2.92  9  0.397  1.0000 
 ANwf - BSrf   2.0847 2.92  9  0.713  0.9971 
 ANwf - BSwf   0.7714 2.92  9  0.264  1.0000 
 ANwf - GRpp   3.5074 2.92  9  1.199  0.9377 
 ANwf - GRrf   0.0976 2.92  9  0.033  1.0000 
 ANwf - GRwf   1.3967 2.92  9  0.478  0.9998 
 BSpp - BSrf   0.9242 2.92  9  0.316  1.0000 
 BSpp - BSwf  -0.3891 2.92  9 -0.133  1.0000 
 BSpp - GRpp   2.3469 2.92  9  0.802  0.9937 
 BSpp - GRrf  -1.0629 2.92  9 -0.363  1.0000 
 BSpp - GRwf   0.2362 2.92  9  0.081  1.0000 
 BSrf - BSwf  -1.3133 2.92  9 -0.449  0.9999 
 BSrf - GRpp   1.4227 2.92  9  0.486  0.9998 
 BSrf - GRrf  -1.9871 2.92  9 -0.679  0.9979 
 BSrf - GRwf  -0.6880 2.92  9 -0.235  1.0000 
 BSwf - GRpp   2.7360 2.92  9  0.935  0.9838 
 BSwf - GRrf  -0.6737 2.92  9 -0.230  1.0000 
 BSwf - GRwf   0.6254 2.92  9  0.214  1.0000 
 GRpp - GRrf  -3.4098 2.92  9 -1.166  0.9459 
 GRpp - GRwf  -2.1107 2.92  9 -0.722  0.9968 
 GRrf - GRwf   1.2991 2.92  9  0.444  0.9999 

P value adjustment: tukey method for comparing a family of 9 estimates 

Call:
lm(formula = frc_14c ~ year_i * pm * eco, data = dens.01.09.19.sp.df[dens.01.09.19.sp.df$frc == 
    "fPOM" & dens.01.09.19.sp.df$lyr_bot == 10, ])

Residuals:
    Min      1Q  Median      3Q     Max 
-36.987  -8.459  -3.794  14.059  31.963 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)    
(Intercept)               165.512     25.131   6.586 0.000101 ***
year_i                     -6.795      2.068  -3.286 0.009443 ** 
pmbasalt                  -43.636     35.541  -1.228 0.250674    
pmgranite                 -23.223     35.541  -0.653 0.529818    
ecocool                  -168.432     35.541  -4.739 0.001060 ** 
ecocold                  -104.629     35.541  -2.944 0.016382 *  
year_i:pmbasalt             4.953      2.925   1.694 0.124591    
year_i:pmgranite            2.606      2.925   0.891 0.396052    
year_i:ecocool              6.114      2.925   2.090 0.066144 .  
year_i:ecocold              5.777      2.925   1.975 0.079678 .  
pmbasalt:ecocool           93.779     50.262   1.866 0.094932 .  
pmgranite:ecocool         103.988     50.262   2.069 0.068483 .  
pmbasalt:ecocold           62.329     50.262   1.240 0.246303    
pmgranite:ecocold          17.972     50.262   0.358 0.728903    
year_i:pmbasalt:ecocool    -5.725      4.136  -1.384 0.199702    
year_i:pmgranite:ecocool   -4.003      4.136  -0.968 0.358422    
year_i:pmbasalt:ecocold    -6.701      4.136  -1.620 0.139664    
year_i:pmgranite:ecocold   -2.367      4.136  -0.572 0.581154    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 26.38 on 9 degrees of freedom
Multiple R-squared:  0.8821,    Adjusted R-squared:  0.6595 
F-statistic: 3.962 on 17 and 9 DF,  p-value: 0.02039


Call:
lm(formula = frc_14c ~ year_i * pm * eco, data = dens.01.09.19.sp.df[dens.01.09.19.sp.df$frc == 
    "fPOM" & dens.01.09.19.sp.df$lyr_bot == 20, ])

Residuals:
    Min      1Q  Median      3Q     Max 
-26.206  -9.681  -4.089   6.602  47.172 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)  
(Intercept)                78.039     28.446   2.743   0.0227 *
year_i                     -4.217      2.341  -1.801   0.1052  
pmbasalt                    2.083     40.229   0.052   0.9598  
pmgranite                 -34.956     40.229  -0.869   0.4075  
ecocool                  -127.141     40.229  -3.160   0.0115 *
ecocold                   -68.688     40.229  -1.707   0.1219  
year_i:pmbasalt             3.623      3.311   1.094   0.3022  
year_i:pmgranite            8.217      3.311   2.482   0.0349 *
year_i:ecocool              4.120      3.311   1.245   0.2447  
year_i:ecocold              3.572      3.311   1.079   0.3086  
pmbasalt:ecocool           71.432     56.892   1.256   0.2409  
pmgranite:ecocool         113.279     56.892   1.991   0.0777 .
pmbasalt:ecocold           47.147     56.892   0.829   0.4287  
pmgranite:ecocold          37.800     56.892   0.664   0.5231  
year_i:pmbasalt:ecocool    -6.787      4.682  -1.450   0.1811  
year_i:pmgranite:ecocool  -10.673      4.682  -2.280   0.0486 *
year_i:pmbasalt:ecocold    -5.429      4.682  -1.160   0.2761  
year_i:pmgranite:ecocold   -8.132      4.682  -1.737   0.1164  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 29.86 on 9 degrees of freedom
Multiple R-squared:  0.8625,    Adjusted R-squared:  0.6027 
F-statistic:  3.32 on 17 and 9 DF,  p-value: 0.03583


Call:
lm(formula = frc_14c ~ year_i * pm * eco, data = dens.01.09.19.sp.df[dens.01.09.19.sp.df$frc == 
    "fPOM" & dens.01.09.19.sp.df$lyr_bot == 30, ])

Residuals:
   Min     1Q Median     3Q    Max 
-32.57 -11.84  -3.65   7.70  58.63 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)
(Intercept)               -7.7862    34.5553  -0.225    0.827
year_i                    -0.5033     2.8436  -0.177    0.863
pmbasalt                  57.2270    48.8686   1.171    0.272
pmgranite                 19.0016    48.8686   0.389    0.706
ecocool                  -67.2614    48.8686  -1.376    0.202
ecocold                  -27.5273    48.8686  -0.563    0.587
year_i:pmbasalt            0.5886     4.0215   0.146    0.887
year_i:pmgranite           3.3000     4.0215   0.821    0.433
year_i:ecocool             0.9728     4.0215   0.242    0.814
year_i:ecocold             1.3306     4.0215   0.331    0.748
pmbasalt:ecocool          45.7950    69.1106   0.663    0.524
pmgranite:ecocool         65.6280    69.1106   0.950    0.367
pmbasalt:ecocold          -1.7179    69.1106  -0.025    0.981
pmgranite:ecocold          3.6995    69.1106   0.054    0.958
year_i:pmbasalt:ecocool   -7.3011     5.6873  -1.284    0.231
year_i:pmgranite:ecocool  -5.8728     5.6873  -1.033    0.329
year_i:pmbasalt:ecocold   -2.4287     5.6873  -0.427    0.679
year_i:pmgranite:ecocold  -3.7023     5.6873  -0.651    0.531

Residual standard error: 36.27 on 9 degrees of freedom
Multiple R-squared:  0.776, Adjusted R-squared:  0.353 
F-statistic: 1.835 on 17 and 9 DF,  p-value: 0.178


Call:
lm(formula = frc_14c ~ year_i * pm * eco, data = dens.01.09.19.sp.df[dens.01.09.19.sp.df$frc == 
    "minC" & dens.01.09.19.sp.df$lyr_bot == 10, ])

Residuals:
    Min      1Q  Median      3Q     Max 
-32.445 -14.690  -0.982   8.313  49.666 

Coefficients:
                            Estimate  Std. Error t value Pr(>|t|)  
(Intercept)                53.235715   31.836582   1.672   0.1288  
year_i                     -1.368463    2.619903  -0.522   0.6141  
pmbasalt                  -11.392863   45.023726  -0.253   0.8059  
pmgranite                  13.808110   45.023726   0.307   0.7661  
ecocool                  -129.550490   45.023726  -2.877   0.0183 *
ecocold                   -53.252323   45.023726  -1.183   0.2672  
year_i:pmbasalt             1.011690    3.705102   0.273   0.7910  
year_i:pmgranite           -0.008576    3.705102  -0.002   0.9982  
year_i:ecocool              3.341545    3.705102   0.902   0.3906  
year_i:ecocold             -0.800799    3.705102  -0.216   0.8337  
pmbasalt:ecocool          100.351702   63.673164   1.576   0.1495  
pmgranite:ecocool         101.017634   63.673164   1.587   0.1471  
pmbasalt:ecocold           -2.086764   63.673164  -0.033   0.9746  
pmgranite:ecocold         -45.174314   63.673164  -0.709   0.4960  
year_i:pmbasalt:ecocool    -2.576587    5.239806  -0.492   0.6347  
year_i:pmgranite:ecocool   -3.747488    5.239806  -0.715   0.4926  
year_i:pmbasalt:ecocold     2.650378    5.239806   0.506   0.6251  
year_i:pmgranite:ecocold    4.370745    5.239806   0.834   0.4258  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 33.41 on 9 degrees of freedom
Multiple R-squared:  0.7665,    Adjusted R-squared:  0.3254 
F-statistic: 1.738 on 17 and 9 DF,  p-value: 0.2008


Call:
lm(formula = frc_14c ~ year_i * pm * eco, data = dens.01.09.19.sp.df[dens.01.09.19.sp.df$frc == 
    "minC" & dens.01.09.19.sp.df$lyr_bot == 20, ])

Residuals:
    Min      1Q  Median      3Q     Max 
-25.918  -9.446  -2.474   9.149  31.546 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -9.5997    21.9478  -0.437   0.6721  
year_i                     0.7565     1.8061   0.419   0.6851  
pmbasalt                  -8.2247    31.0389  -0.265   0.7970  
pmgranite                -11.4347    31.0389  -0.368   0.7211  
ecocool                  -94.7296    31.0389  -3.052   0.0137 *
ecocold                  -15.3565    31.0389  -0.495   0.6326  
year_i:pmbasalt            0.7698     2.5543   0.301   0.7700  
year_i:pmgranite           3.0074     2.5543   1.177   0.2692  
year_i:ecocool             1.2303     2.5543   0.482   0.6415  
year_i:ecocold            -2.6857     2.5543  -1.051   0.3205  
pmbasalt:ecocool         127.3757    43.8956   2.902   0.0175 *
pmgranite:ecocool        124.8421    43.8956   2.844   0.0193 *
pmbasalt:ecocold          -0.9729    43.8956  -0.022   0.9828  
pmgranite:ecocold        -31.2191    43.8956  -0.711   0.4950  
year_i:pmbasalt:ecocool   -4.6467     3.6123  -1.286   0.2304  
year_i:pmgranite:ecocool  -5.8824     3.6123  -1.628   0.1379  
year_i:pmbasalt:ecocold    2.9547     3.6123   0.818   0.4345  
year_i:pmgranite:ecocold   2.1864     3.6123   0.605   0.5599  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.04 on 9 degrees of freedom
Multiple R-squared:  0.8619,    Adjusted R-squared:  0.6011 
F-statistic: 3.305 on 17 and 9 DF,  p-value: 0.03635


Call:
lm(formula = frc_14c ~ year_i * pm * eco, data = dens.01.09.19.sp.df[dens.01.09.19.sp.df$frc == 
    "minC" & dens.01.09.19.sp.df$lyr_bot == 30, ])

Residuals:
    Min      1Q  Median      3Q     Max 
-21.580  -9.094   3.950   6.546  38.845 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)  
(Intercept)              -54.2864    20.6763  -2.626   0.0276 *
year_i                     1.7628     1.7015   1.036   0.3272  
pmbasalt                  -4.1368    29.2407  -0.141   0.8906  
pmgranite                -39.1905    29.2407  -1.340   0.2130  
ecocool                  -58.1383    29.2407  -1.988   0.0780 .
ecocold                   15.4194    29.2407   0.527   0.6107  
year_i:pmbasalt           -0.1398     2.4063  -0.058   0.9550  
year_i:pmgranite           3.6500     2.4063   1.517   0.1636  
year_i:ecocool            -1.0213     2.4063  -0.424   0.6812  
year_i:ecocold            -5.3002     2.4063  -2.203   0.0551 .
pmbasalt:ecocool         132.3396    41.3525   3.200   0.0108 *
pmgranite:ecocool        133.4644    41.3525   3.227   0.0104 *
pmbasalt:ecocold         -34.7870    41.3525  -0.841   0.4220  
pmgranite:ecocold         -6.5936    41.3525  -0.159   0.8768  
year_i:pmbasalt:ecocool   -4.8607     3.4030  -1.428   0.1870  
year_i:pmgranite:ecocool  -4.8928     3.4030  -1.438   0.1843  
year_i:pmbasalt:ecocold    6.4371     3.4030   1.892   0.0911 .
year_i:pmgranite:ecocold   3.3074     3.4030   0.972   0.3565  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.7 on 9 degrees of freedom
Multiple R-squared:  0.8748,    Adjusted R-squared:  0.6383 
F-statistic: 3.699 on 17 and 9 DF,  p-value: 0.0255
NOTE: Results may be misleading due to involvement in interactions
NOTE: Results may be misleading due to involvement in interactions
NOTE: Results may be misleading due to involvement in interactions
NOTE: Results may be misleading due to involvement in interactions
NOTE: Results may be misleading due to involvement in interactions

Char pool calc

`summarise()` has grouped output by 'PMeco', 'pm', 'eco', 'lyr_bot', 'soc_POM'. You can override using the `.groups` argument.

Fraction vs respired 14C

NOTE: Results may be misleading due to involvement in interactions

Thermal fractions

C release (thermograms)

Thermal fraction 14C


Attaching package: ‘gridExtra’

The following object is masked from ‘package:dplyr’:

    combine

package ‘mclust’ was built under R version 3.6.2    __  ___________    __  _____________
   /  |/  / ____/ /   / / / / ___/_  __/
  / /|_/ / /   / /   / / / /\__ \ / /   
 / /  / / /___/ /___/ /_/ /___/ // /    
/_/  /_/\____/_____/\____//____//_/    version 5.4.9
Type 'citation("mclust")' for citing this R package in publications.

Attaching package: ‘mclust’

The following object is masked from ‘package:aqp’:

    sim

package ‘DescTools’ was built under R version 3.6.2
Attaching package: ‘DescTools’

The following object is masked from ‘package:mclust’:

    BrierScore


Attaching package: ‘questionr’

The following object is masked from ‘package:GSIF’:

    describe

package ‘sjstats’ was built under R version 3.6.2Registered S3 method overwritten by 'parameters':
  method                         from      
  format.parameters_distribution datawizard
Registered S3 methods overwritten by 'effectsize':
  method              from      
  standardize.Surv    datawizard
  standardize.bcplm   datawizard
  standardize.clm2    datawizard
  standardize.default datawizard
  standardize.mediate datawizard
  standardize.wbgee   datawizard
  standardize.wbm     datawizard

Attaching package: ‘sjstats’

The following object is masked from ‘package:questionr’:

    prop

Loading required package: lattice
Loading required package: survival
package ‘survival’ was built under R version 3.6.2Loading required package: Formula

Attaching package: ‘Hmisc’

The following objects are masked from ‘package:questionr’:

    describe, wtd.mean, wtd.table, wtd.var

The following objects are masked from ‘package:DescTools’:

    %nin%, Label, Mean, Quantile

The following object is masked from ‘package:GSIF’:

    describe

The following object is masked from ‘package:gt’:

    html

The following objects are masked from ‘package:dplyr’:

    src, summarize

The following objects are masked from ‘package:base’:

    format.pval, units
Currently analysing dataframe 
Between 0 and 140 degrees C the proportion of sample C is 0.001488078 
Between 140 and 245 degrees C the proportion of sample C is 0.03870194 
Between 245 and 340 degrees C the proportion of sample C is 0.3571529 
Between 340 and 390 degrees C the proportion of sample C is 0.2355014 
Between 390 and 495 degrees C the proportion of sample C is 0.2936209 
Between 495 and 791 degrees C the proportion of sample C is 0.07359725 
Currently analysing dataframe 
Between 0 and 141.5 degrees C the proportion of sample C is 0.002647777 
Between 141.5 and 246.5 degrees C the proportion of sample C is 0.07616599 
Between 246.5 and 290 degrees C the proportion of sample C is 0.1643875 
Between 290 and 364 degrees C the proportion of sample C is 0.3792163 
Between 364 and 484 degrees C the proportion of sample C is 0.3074933 
Between 484 and 788 degrees C the proportion of sample C is 0.07006177 
Currently analysing dataframe 
Between 0 and 143 degrees C the proportion of sample C is 0.005167379 
Between 143 and 248 degrees C the proportion of sample C is 0.07075111 
Between 248 and 293 degrees C the proportion of sample C is 0.163502 
Between 293 and 367 degrees C the proportion of sample C is 0.3797734 
Between 367 and 487 degrees C the proportion of sample C is 0.3038745 
Between 487 and 792 degrees C the proportion of sample C is 0.07718191 

LS0tCnRpdGxlOiAiU2llcnJhIE5ldmFkYSBGcmFjdGlvbiBBbmFseXNpcyIKYXV0aG9yOiBKLiBCZWVtLU1pbGxlcgpkYXRlOiBcdGV4dGl0e1x0b2RheX0Kb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICcyJwogIHBkZl9kb2N1bWVudDoKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMwogIGh0bWxfbm90ZWJvb2s6CiAgICBjc3M6ICJjdXN0b20uY3NzIgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMgpoZWFkZXJfaW5jbHVkZXM6Ci0gXHVzZXBhY2thZ2VbdXRmOF17aW5wdXRlbmN9Ci0gXHVzZXBhY2thZ2V7ZmxvYXR9Ci0tLQoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYWxpZ24gPSAnY2VudGVyJywgZGV2ID0gYygnY2Fpcm9fcGRmJywgJ3BuZycpLCBmaWcud2lkdGggPSA2LjUsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0ID0gMy41KQpvcHRpb25zKHNjaXBlbiA9IDUpCiMgbG9hZCBwYWdlIGJyZWFrcyBmeApzb3VyY2UoIi4vdXRpbGl0aWVzL3BhZ2VfYnJlYWtfUm1kLlIiKQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShTb2lsUikKbGlicmFyeShvcGVueGxzeCkKbGlicmFyeShJU1JhRCkKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KGVtbWVhbnMpCmxpYnJhcnkoZ3QpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KEdTSUYpCmxpYnJhcnkoYXFwKQpgYGAKCmBgYHtyIGxvYWQgcmF3LWRhdGEtaW5nZXN0IGZ4fQpzb3VyY2UoIi4vdXRpbGl0aWVzL2plbmFfYW1zX2luZ2VzdC5SIikKc291cmNlKCIuL3V0aWxpdGllcy9qZW5hX2lzb19pbmdlc3QuUiIpCnNvdXJjZSgiLi91dGlsaXRpZXMvamVuYV9lbG1faW5nZXN0LlIiKQpgYGAKCmBgYHtyIHBsb3QtZnVuc30KIyBjb2xvciBwYWxldHRlcyBmb3IgRUNPICYgUE0Kd2FybSA8LSAiI0JGODEyRCIKY29vbCA8LSAiIzgwQ0RDMSIKY29sZCA8LSAiIzAxNjY1RSIKZ3Jhbml0ZSA8LSAiIzlkYWJhOSIKYW5kZXNpdGUgPC0gIiMzODJkYmYiCmJhc2FsdCA8LSAiI2JmMzgyZCIKbWluQyA8LSAiIzliMDAzZiIKZlBPTSA8LSAiIzNmOWIwMCIKb1BPTSA8LSAiIzAwNDdhZiIKYGBgCgojIExvYWQgZGF0YQojIyBJbnRlcm5hbCAKIyMjIENOCiMjIyMgUmVhZCByYXcKCmBgYHtyIGxvYWQtY24tZGF0fQojIDIwMDEgJiAyMDE5IGRlbnNpdHkgZnJhY3Rpb24gZGF0YQplbG1fcmVzdWx0c19kaXIgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImVsbV9qZW5hX3Jlc3VsdHMiLCBmdWxsLm5hbWVzID0gVFJVRSkKZWxtX3Jlc3VsdHNfbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhlbG1fcmVzdWx0c19kaXIpLCBmdW5jdGlvbihpKSB7CiAgaWYgKGdyZXBsKCJlbG1famVuYV9yZXN1bHRzLXNvaWwiLCBlbG1fcmVzdWx0c19kaXJbaV0pKSB7CiAgICB0ZW1wbGF0ZV9maWxlIDwtICIuLi9kYXRhL3Jhdy9lbG1famVuYV90ZW1wbGF0ZS9lbG1famVuYV90ZW1wbGF0ZTIueGxzIgogIH0gZWxzZSB7CiAgICB0ZW1wbGF0ZV9maWxlIDwtICIuLi9kYXRhL3Jhdy9lbG1famVuYV90ZW1wbGF0ZS9lbG1famVuYV90ZW1wbGF0ZS54bHMiCiAgfQogIHJlYWRfamVuYV9lbG1fcmVzdWx0cyhlbG1fcmVzdWx0c19kaXJbaV0sIHRlbXBsYXRlX2ZpbGUgPSB0ZW1wbGF0ZV9maWxlKQp9KQpuYW1lcyhlbG1fcmVzdWx0c19scykgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImVsbV9qZW5hX3Jlc3VsdHMiKQoKIyBzZXBhcmF0ZSBidWxrQyBmcm9tIGZyY0MKZWxtX3Jlc3VsdHNfYmxrQ19scyA8LSBlbG1fcmVzdWx0c19sc1t3aGljaChncmVwbCgiZWxtX2plbmFfcmVzdWx0cy1zb2lsIiwgbmFtZXMoZWxtX3Jlc3VsdHNfbHMpKSldCmVsbV9yZXN1bHRzX2ZyY0NfbHMgPC0gZWxtX3Jlc3VsdHNfbHNbd2hpY2goZ3JlcGwoImVsbV9qZW5hX3Jlc3VsdHMtZnJjIiwgbmFtZXMoZWxtX3Jlc3VsdHNfbHMpKSldCgojIGV4dHJhY3QgYnVsayBDIGFuZCBzdW1tYXJpemUKc3JhLmJsay4yMDE5LmRmIDwtIGJpbmRfcm93cyh1bmxpc3QoZWxtX3Jlc3VsdHNfYmxrQ19scywgcmVjdXJzaXZlID0gRkFMU0UpKSAlPiUKICBtdXRhdGUoUE1lY28gPSBzYXBwbHkoc3Ryc3BsaXQoSUQsICJfIiksICJbIiwgMiksCiAgICAgICAgIGRlcHRoID0gc2FwcGx5KHN0cnNwbGl0KElELCAiXyIpLCAiWyIsIDQpKQpzcmEuYmxrLjIwMTkuc3VtLmRmIDwtIHNyYS5ibGsuMjAxOS5kZiAlPiUKICBncm91cF9ieShQTWVjbywgZGVwdGgpICU+JQogIHN1bW1hcml6ZShhY3Jvc3MoYyhDLCBOKSwgLmZucyA9IGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgbXV0YXRlKElEMiA9IHBhc3RlKFBNZWNvLCBkZXB0aCwgc2VwID0gIl8iKSkKYGBgCgojIyMjIFRlbXBsYXRlcwoKYGBge3IgY3JlYXRlLWZyYy1kYXRhLXRlbXBsYXRlc30KIyMgQ3JlYXRlIHRlbXBsYXRlIGZvciBjb21wb3NpdGUgc29pbCBkYXRhIChlLmcuIGRlbnNpdHkgZnJhY3Rpb25zKQojIEJhc2ljIGxpc3QgdGVtcGxhdGUKUE1lY28ubHMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IDkpCm5hbWVzKFBNZWNvLmxzKSA8LSBsZXZlbHMoaW50ZXJhY3Rpb24oYygiQU4iLCAiQlMiLCAiR1IiKSwgYygicHAiLCAid2YiLCAicmYiKSwgc2VwID0gIiIpKQoKIyBsaXN0IG9mIGRlcHRocyBmb3IgMjAwMSBzYW1wbGVzCmRlcHRoX2JvdF8yMDAxLmxzIDwtIGxpc3QoQU5wcCA9IGMoNiwgMTMsIDMzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBBTndmID0gYygxMSwgMzUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEFOcmYgPSBjKDExLCAzMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgQlNwcCA9IGMoNywgMTgsIDI4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBCU3dmID0gYygxMCwgMTkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEJTcmYgPSBjKDgsIDE1LCAzMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgR1JwcCA9IGMoNywgMTUsIDI3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBHUndmID0gYyg0LCAxMywgMjgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEdScmYgPSBjKDgsIDI3KSkKCiMgbGlzdCBvZiBkZXB0aHMgZm9yIDIwMTkgc2FtcGxlcwpkZXB0aF9ib3RfMjAxOS5scyA8LSBsYXBwbHkoUE1lY28ubHMsIGZ1bmN0aW9uKGRmKSBzZXEoMTAsIDMwLCAxMCkpCgojIHRlbXBsYXRlIGZ4CnNyYS5mcmMudGVtcGxhdGUuZnggPC0gZnVuY3Rpb24oZGVwdGhfYm90LCB5ZWFyKSB7CiAgbm1zIDwtIG5hbWVzKGRlcHRoX2JvdCkKICBscyA8LSBsYXBwbHkoc2VxX2Fsb25nKGRlcHRoX2JvdCksIGZ1bmN0aW9uKGkpIHsKICAgIG4gPC0gbGVuZ3RoKGRlcHRoX2JvdFtbaV1dKQogICAgZGYgPC0gZGF0YS5mcmFtZSh5ZWFyID0gcmVwKHllYXIsIG4pLAogICAgICAgICAgICAgICAgICAgICBQTSA9IHJlcChzdWJzdHIobm1zW2ldLCAxLCAyKSwgbiksIAogICAgICAgICAgICAgICAgICAgICBFQ08gPSByZXAoc3Vic3RyKG5tc1tpXSwgMywgNCksIG4pLAogICAgICAgICAgICAgICAgICAgICBseXJfYm90ID0gZGVwdGhfYm90W1tpXV0pCiAgICBkZiRseXJfdG9wIDwtIHNhcHBseShzZXFfYWxvbmcoZGVwdGhfYm90W1tpXV0pLCBmdW5jdGlvbihqKSB7CiAgICAgIGlmIChqID09IDEpIHsKICAgICAgICAwCiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVwdGhfYm90W1tpXV1baiAtIDFdCiAgICAgIH0KICAgIH0pCiAgICBkZiRJRCA8LSBwYXN0ZTAoZGYkUE0sIGRmJEVDTywgIl9jb21wXyIsIGRmJHllYXIsICJfIiwgZGYkbHlyX3RvcCwgIi0iLCBkZiRseXJfYm90KQogICAgcmV0dXJuKGRmKQogIH0pCiAgbmFtZXMobHMpIDwtIG5tcwogIGZyYy5scyA8LSByZXBsaWNhdGUoMywgbHMsIEZBTFNFKQogIG5hbWVzKGZyYy5scykgPC0gYygiRlBPTSIsICJPUE9NIiwgIk1PTSIpCiAgcmV0dXJuKGZyYy5scykKfQoKIyAyMDAxCnNyYS5mcmMudG1wLjIwMDEubHMgPC0gc3JhLmZyYy50ZW1wbGF0ZS5meChkZXB0aF9ib3RfMjAwMS5scywgMjAwMSkKCiMgMjAxOQpzcmEuZnJjLnRtcC4yMDE5LmxzIDwtIHNyYS5mcmMudGVtcGxhdGUuZngoZGVwdGhfYm90XzIwMTkubHMsIDIwMTkpCmBgYAoKIyMjIyBNZXJnZSByYXcgdy8gdGVtcGxhdGUKCmBgYHtyIGZpbGwtZnJjLWNufQojIGRlZmluZSBleHRyYWN0aW9uIGZ1bmN0aW9uCmZpbGwuY24uZnggPC0gZnVuY3Rpb24odGVtcGxhdGUsIGVsbV9yZXN1bHRzX2xzLCB5ZWFyLCB0eXBlKSB7CiAgCiAgIyBpbnRlcm5hbCBmeCBmb3IgZXh0cmFjdGluZyBjbiBkYXRhIGFuZCBhdmVyYWdpbmcgYW5hbHl0aWNhbCBkdXBsaWNhdGVzIGFzIG5lZWRlZAogIGV4dHJhY3QuZWxtLmZ4IDwtIGZ1bmN0aW9uKGxzKSB7CiAgICBsYXBwbHkobHMsIGZ1bmN0aW9uKHgpIHsKICAgICAgaXggPC0gZ3JlcCh4JElELCBjbi5kZiRJRCkKICAgICAgaWYgKGxlbmd0aChpeCA+IDEpKSB7CiAgICAgICAgeCA8LSBjYmluZCh4LAogICAgICAgICAgICAgICAgICAgQyA9IG1lYW4oY24uZGZbaXgsICJDIl0pLCAKICAgICAgICAgICAgICAgICAgIE4gPSBtZWFuKGNuLmRmW2l4LCAiTiJdKSwgCiAgICAgICAgICAgICAgICAgICByb3cubmFtZXMgPSBOVUxMKQogICAgICB9IGVsc2UgaWYgKGxlbmd0aChpeCkgPT0gMSkgewogICAgICAgIHggPC0gY2JpbmQoeCwgY24uZGZbaXgsIGMoIkMiLCAiTiIpXSwgcm93Lm5hbWVzID0gTlVMTCkKICAgICAgfQogICAgICByZXR1cm4oeCkKICAgIH0pICAgIAogIH0KICAKICAjIHNlbGVjdCBDTiBkYXRhIGJ5IHllYXIKICBjbi5scyA8LSB1bmxpc3QoCiAgICBsYXBwbHkoZ3JlcChwYXN0ZTAodHlwZSwgc3Vic3RyKHllYXIsIDMsIDQpKSwgbmFtZXMoZWxtX3Jlc3VsdHNfbHMpKSwgZnVuY3Rpb24oaSkgewogICAgICBlbG1fcmVzdWx0c19sc1tbaV1dCiAgICB9KSwgcmVjdXJzaXZlID0gRkFMU0UpCiAgCiAgIyBzdG9yZSBmcmFjdGlvbiBuYW1lcwogIG5tcyA8LSBuYW1lcyh0ZW1wbGF0ZSkKICAKICAjIGxvb3AgZm9yIHJ1bm5pbmcgZXh0cmFjdGlvbgogIGZvcihpIGluIHNlcV9hbG9uZyhubXMpKSB7CiAgICAKICAgICMgbWFrZSBkYXRhIGZyYW1lIG9mIGRhdGEgZm9yIHRhcmdldCBmcmFjdGlvbiBhbmQgeWVhcgogICAgY24uZGYgPC0gYmluZF9yb3dzKGNuLmxzW2dyZXAobmFtZXModGVtcGxhdGUpW2ldLCBuYW1lcyhjbi5scykpXSkKICAgIAogICAgIyBjaGVjayBpZiB0YXJnZXQgZnJhY3Rpb24gZGF0YSBleGlzdCBhbmQgcnVuIGV4dHJhY3Rpb24gZnVuY3Rpb24gaWYgc28KICAgIGlmIChucm93KGNuLmRmKSAhPSAwKSB7CiAgICAgIAogICAgICAjIGV4dHJhY3QgZGF0YSBmb3IgZWFjaCBmcmFjdGlvbgogICAgICB0ZW1wbGF0ZVtbaV1dIDwtIGxhcHBseSh0ZW1wbGF0ZVtbaV1dLCBmdW5jdGlvbihkZikgewogICAgICAgIGJpbmRfcm93cyhleHRyYWN0LmVsbS5meChzcGxpdChkZiwgZGYkSUQpKSkKICAgICAgfSkKICAgIH0KICB9CiAgCiAgIyByZXR1cm4gb3V0cHV0IGxpc3QgbmFtZWQgYnkgdGFyZ2V0IGZyYWN0aW9uCiAgbmFtZXModGVtcGxhdGUpIDwtIG5tcwogIHJldHVybih0ZW1wbGF0ZSkgCn0KCiMgZXh0cmFjdCBsYXllciBkYXRhIGJ5IHllYXIKc3JhLmZyYy4yMDAxLmxzIDwtIGZpbGwuY24uZngoc3JhLmZyYy50bXAuMjAwMS5scywgZWxtX3Jlc3VsdHNfZnJjQ19scywgMjAwMSwgImZyYyIpCnNyYS5mcmMuMjAxOS5scyA8LSBmaWxsLmNuLmZ4KHNyYS5mcmMudG1wLjIwMTkubHMsIGVsbV9yZXN1bHRzX2ZyY0NfbHMsIDIwMTksICJmcmMiKQpgYGAKCiMjIyAxNEMKCmBgYHtyIGxvYWQtMTRjLWRhdH0KIyByZWFkIGFtcyBkaXIKYW1zX2plbmFfcmVzdWx0c19kaXJzIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJhbXNfamVuYV9yZXN1bHRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpCgojIGxpc3QgZmlsZXMgdy8gbmV3IGFuZCBvbGQgdGVtcGxhdGVzIGJ5IGRhdGUKZGF0ZXMgPC0gc2FwcGx5KGxhcHBseShzdHJzcGxpdChhbXNfamVuYV9yZXN1bHRzX2RpcnMsICJfKD8hLipfKSIsIHBlcmwgPSBUUlVFKSwgIltbIiwgMiksIGFzLkRhdGUpCmFtc19qZW5hX3Jlc3VsdHNfZGlyc19uZXcgPC0gYW1zX2plbmFfcmVzdWx0c19kaXJzW3doaWNoKGRhdGVzID4gYXMuRGF0ZSgiMjAyMi0wMS0yMyIpKV0KYW1zX2plbmFfcmVzdWx0c19kaXJzX29sZCA8LSBhbXNfamVuYV9yZXN1bHRzX2RpcnNbd2hpY2goZGF0ZXMgPCBhcy5EYXRlKCIyMDIyLTAxLTIzIikpXQoKIyBuZXcgdGVtcGxhdGUKbmV3X3RlbXBsYXRlIDwtICIuLi9kYXRhL3Jhdy9hbXNfamVuYV90ZW1wbGF0ZV8yMDIyLTAxLTI0L2Ftc19qZW5hX3RlbXBsYXRlLnhsc3giCgojIHJlYWQgaW4gZGF0YQphbXNfcmVzdWx0c19scyA8LSBjKAogIGxhcHBseShzZXFfYWxvbmcoYW1zX2plbmFfcmVzdWx0c19kaXJzX25ldyksIGZ1bmN0aW9uKGkpIHsKICAgIHJlYWRfamVuYV9hbXNfcmVzdWx0cyhhbXNfamVuYV9yZXN1bHRzX2RpcnNfbmV3W2ldLCAKICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9maWxlID0gbmV3X3RlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gMzEpCiAgfSksCiAgbGFwcGx5KHNlcV9hbG9uZyhhbXNfamVuYV9yZXN1bHRzX2RpcnNfb2xkKSwgZnVuY3Rpb24oaSkgewogICAgcmVhZF9qZW5hX2Ftc19yZXN1bHRzKGFtc19qZW5hX3Jlc3VsdHNfZGlyc19vbGRbaV0pCiAgfSkpCm5hbWVzKGFtc19yZXN1bHRzX2xzKSA8LSB1bmxpc3QoCiAgYyhsYXBwbHkoc3Ryc3BsaXQoYW1zX2plbmFfcmVzdWx0c19kaXJzX25ldywgIi8oPyEuKi8pIiwgcGVybCA9IFRSVUUpLCAiW1siLCAyKSwKICAgIGxhcHBseShzdHJzcGxpdChhbXNfamVuYV9yZXN1bHRzX2RpcnNfb2xkLCAiLyg/IS4qLykiLCBwZXJsID0gVFJVRSksICJbWyIsIDIpKSkKCiMgcmVtb3ZlIGZsYXdlZCBBTnJmIHNhbXBsZXMKQU5yZi5ybSA8LSBjKCIxMF9BTnJmX2NvbXBfMjAxOV8wLTEwX01PTSIsIAogICAgICAgICAgICAgIjExX0FOcmZfY29tcF8yMDE5XzEwLTIwX01PTV9hIiwKICAgICAgICAgICAgICIxMl9BTnJmX2NvbXBfMjAxOV8yMC0zMF9NT00iKQppZiAoYW55KCFpcy5uYShtYXRjaChBTnJmLnJtLCBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1mcmMxOS1NT01fMjAyMS0wNi0yNmAkYEJlZW0tTWlsbGVyXzI0Lnhsc3hgJFByb2JlKSkpKSB7CiAgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtZnJjMTktTU9NXzIwMjEtMDYtMjZgJGBCZWVtLU1pbGxlcl8yNC54bHN4YCA8LSBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1mcmMxOS1NT01fMjAyMS0wNi0yNmAkYEJlZW0tTWlsbGVyXzI0Lnhsc3hgWy1tYXRjaChBTnJmLnJtLCBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1mcmMxOS1NT01fMjAyMS0wNi0yNmAkYEJlZW0tTWlsbGVyXzI0Lnhsc3hgJFByb2JlKSwgXQp9CgojICMgc2VwYXJhdGUgcmVkb3MKIyBhbXNfcmVzdWx0c19yZWRvX2xzIDwtIGxhcHBseShhbXNfcmVzdWx0c19scywgZnVuY3Rpb24obHMpCiMgICAgIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKIyAgICAgICBkZl9SIDwtIGRmW2dyZXAoIl9SIiwgZGYkUHJvYmUpLCBdIAojICAgICAgIGlmIChucm93KGRmX1IpICE9IDApIHsKIyAgICAgICAgIGRmX1IKIyAgICAgICB9CiMgICAgIH0pKSkKIyBhbXNfcmVzdWx0c19yZWRvX2RmIDwtIGJpbmRfcm93cyhGaWx0ZXIoCiMgICAgIE5lZ2F0ZShpcy5udWxsKSwgbGFwcGx5KGFtc19yZXN1bHRzX3JlZG9fbHMsIGZ1bmN0aW9uKGxzKSB7CiMgICAgICAgaWYgKGxlbmd0aChscykgPiAwKSB7CiMgICAgICAgICBiaW5kX3Jvd3MobHMpCiMgICAgICAgfQojICAgICB9KSkpICU+JQojICAgZmlsdGVyKCFpcy5uYShGMTRDKSkKYGBgCgojIyMgTWFzcwoKYGBge3IgbG9hZC1mcmMtbWFzcy1kYXRhfQojIGxvYWQgcmF3IGRhdGEKc3JhLmZyYy5tc3MucmF3IDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvcmF3L2xhYl9qZW5hX3Jlc3VsdHMtZnJjMTktZnJjMDFfMjAyMS0wNS0wNS9EaWNodGVmcmFrdGlvbmllcnVuZ19KZWZmXzIwMjAueGxzIiwgc2hlZXQgPSAiVGFiZWxsZTEiKQoKIyBmaWx0ZXIgYW5kIHJlZHVjZQpzcmEuZnJjLm1zcy5kZiA8LSBzcmEuZnJjLm1zcy5yYXcgJT4lCiAgZmlsdGVyKGlzLm5hKFNhbXBsZVJlZG9uZSkpICU+JQogIHNlbGVjdChQcm9iZSwgYEVpbndhYWdlIChnKWAsIEZyYWt0aW9uLCBgTEYgKGcpYCwgYEhGIChnKWApICU+JQogIG11dGF0ZSh5aWVsZCA9IGlmZWxzZShpcy5uYShgTEYgKGcpYCksIGBIRiAoZylgLCBgTEYgKGcpYCkpICU+JQogIHNlbGVjdCgtYyhgTEYgKGcpYCwgYEhGIChnKWApKSAlPiUKICByZW5hbWUod3RfZyA9IGBFaW53YWFnZSAoZylgKQoKIyAxKSBjb21iaW5lIG11bHRpcGxlIGZsYXNrIHNhbXBsZXMgZm9yIGluZGl2aWR1YWwgZmxhc2tzCiMgMikgZmlsbCBpbiBtaXNzaW5nIG9QT00gZGF0YSBmcm9tIDIwMTkgR1JyZiBzaXRlcwojIE5COiBhbG1vc3Qgbm8gbG9zcyBmb3IgMjAwMSBzaXRlcywgc28gc2VlbXMganVzdGlmaWVkIHRvIGFzc3VtZSBub25lIGluIDIwMTkKc3JhLmZyYy5tc3Mud2lkZS5kZiA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KHNwbGl0KHNyYS5mcmMubXNzLmRmLCBzcmEuZnJjLm1zcy5kZiRQcm9iZSksIGZ1bmN0aW9uKGRmKSB7CiAgICBpZiAobnJvdyhkZikgPiAzKSB7CiAgICAgIGRmIDwtIGRmICU+JSAKICAgICAgICBncm91cF9ieShGcmFrdGlvbiwgUHJvYmUsIHd0X2cpICU+JQogICAgICAgIHN1bW1hcml6ZSh5aWVsZCA9IHN1bSh5aWVsZCksIC5ncm91cHMgPSAiZHJvcCIpCiAgICB9CiAgICByZXR1cm4oZGYpCiAgfSkpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBGcmFrdGlvbiwgdmFsdWVzX2Zyb20gPSB5aWVsZCkgJT4lCiAgcmVuYW1lKEZQT00gPSBmUE9NLCBPUE9NID0gb1BPTSwgTU9NID0gSEYpICU+JQogIG11dGF0ZShPUE9NID0gaWZlbHNlKGlzLm5hKE9QT00pLCB3dF9nIC0gRlBPTSAtIE1PTSwgT1BPTSkpCgojIHN1bSBtYXNzCnNyYS5mcmMubXNzLndpZGUuZGYkbWFzc19zdW0gPC0gcm93U3VtcyhzcmEuZnJjLm1zcy53aWRlLmRmWyAsIGMoIkZQT00iLCAiT1BPTSIsICJNT00iKV0pCgojIHBpdm90IGxvbmdlciBhbmQgY2FsY3VsYXRlIG1hc3MgcGN0CnNyYS5mcmMubXNzLmxvbmcuZGYgPC0gc3JhLmZyYy5tc3Mud2lkZS5kZiAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGMoIkZQT00iLCAiT1BPTSIsICJNT00iKSwgbmFtZXNfdG8gPSAiZnJjIiwgdmFsdWVzX3RvID0gIm1hc3NfZyIpICU+JQogIG11dGF0ZShtYXNzX3BjdCA9IHJvdW5kKG1hc3NfZyAvIG1hc3Nfc3VtICogMTAwLCAxKSwKICAgICAgICAgZGVwdGggPSBzYXBwbHkoc3Ryc3BsaXQoUHJvYmUsICJfKD8hLipfKSIsIHBlcmwgPSBUUlVFKSwgIltbIiwgMiksCiAgICAgICAgIGx5cl90b3AgPSBhcy5udW1lcmljKHNhcHBseShzdHJzcGxpdChkZXB0aCwgIlstXSIpLCAiW1siLCAxKSksCiAgICAgICAgIGx5cl9ib3QgPSBhcy5udW1lcmljKHNhcHBseShzdHJzcGxpdChkZXB0aCwgIlstXSIpLCAiW1siLCAyKSksCiAgICAgICAgIHllYXIgPSBhcy5udW1lcmljKHNhcHBseShzdHJzcGxpdChQcm9iZSwgIl8iKSwgIltbIiwgMykpLAogICAgICAgICBQTWVjbyA9IHNhcHBseShzdHJzcGxpdChQcm9iZSwgIl8iKSwgIltbIiwgMSkpICU+JQogIGFycmFuZ2UobHlyX2JvdCkKCiMgc3BsaXQgYnkgeWVhcgpzcmEuZnJjLm1zcy5sb25nLjAxLmRmIDwtIHNyYS5mcmMubXNzLmxvbmcuZGZbc3JhLmZyYy5tc3MubG9uZy5kZiR5ZWFyID09IDIwMDEsIF0Kc3JhLmZyYy5tc3MubG9uZy4xOS5kZiA8LSBzcmEuZnJjLm1zcy5sb25nLmRmW3NyYS5mcmMubXNzLmxvbmcuZGYkeWVhciA9PSAyMDE5LCBdCmBgYAoKCmBgYHtyIHBsb3QtZnJjLW1hc3MtbG9zc2VzfQojIGNhbGMgbG9zcywgZHJvcCBzYW1wbGVzIHdpdGhvdXQgYWxsIHdlaWdodHMKc3JhLmZyYy5tc3MubHNzLmRmIDwtIHNyYS5mcmMubXNzLndpZGUuZGYKc3JhLmZyYy5tc3MubHNzLmRmJHN1bSA8LSByb3dTdW1zKHNyYS5mcmMubXNzLmxzcy5kZlsgLCBjKCJGUE9NIiwgIk9QT00iLCAiTU9NIildKQpzcmEuZnJjLm1zcy5sc3MuZGYkbG9zcyA8LSBzcmEuZnJjLm1zcy5sc3MuZGYkd3RfZyAtIHNyYS5mcmMubXNzLmxzcy5kZiRzdW0Kc3JhLmZyYy5tc3MubHNzLmRmJGxvc3NfcGN0IDwtIChzcmEuZnJjLm1zcy5sc3MuZGYkbG9zcyAvIHNyYS5mcmMubXNzLmxzcy5kZiR3dF9nKSAqIDEwMAogIAojIHN1bW1hcml6ZSBsb3NzZXMgYnkgUE0sIEVDTwpzcmEuZnJjLm1zcy5sc3MuZGYkUE0gPC0gc3Vic3RyKHNyYS5mcmMubXNzLmxzcy5kZiRQcm9iZSwgMSwgMikKc3JhLmZyYy5tc3MubHNzLmRmJEVDTyA8LSBmYWN0b3Ioc3Vic3RyKHNyYS5mcmMubXNzLmxzcy5kZiRQcm9iZSwgMywgNCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKQpzcmEuZnJjLm1zcy5sc3MuZGYkeWVhciA8LSBhcy5udW1lcmljKHN1YnN0cihzcmEuZnJjLm1zcy5sc3MuZGYkUHJvYmUsIDExLCAxNCkpCnNyYS5mcmMubXNzLmxzcy5kZiRkZXB0aCA8LSBzYXBwbHkoCiAgc3Ryc3BsaXQoc3JhLmZyYy5tc3MubHNzLmRmJFByb2JlLCAiXyg/IS4qXykiLCBwZXJsID0gVFJVRSksIAogICJbWyIsIDIpCnNyYS5mcmMubXNzLmxzcy5kZiRseXJfYm90IDwtIGFzLm51bWVyaWMoaWZlbHNlKG5jaGFyKHNyYS5mcmMubXNzLmxzcy5kZiRkZXB0aCkgPT0gMywgc3Vic3RyKHNyYS5mcmMubXNzLmxzcy5kZiRkZXB0aCwgMywgMyksIGlmZWxzZShuY2hhcihzcmEuZnJjLm1zcy5sc3MuZGYkZGVwdGgpID09IDQsIHN1YnN0cihzcmEuZnJjLm1zcy5sc3MuZGYkZGVwdGgsIDMsIDQpLCBzdWJzdHIoc3JhLmZyYy5tc3MubHNzLmRmJGRlcHRoLCA0LCA1KSkpKQoKIyMgc3VtbWFyaXplCiMgc3VtbWFyeShsbShsb3NzX3BjdCB+IFBNICsgRUNPICsgeWVhciArIGx5cl9ib3QsIAojICAgICAgICAgICAgc3JhLmZyYy5tc3MubHNzLmRmWy13aGljaChzcmEuZnJjLm1zcy5sc3MuZGYkUHJvYmUgPT0gIkJTcHBfY29tcF8yMDAxXzE4LTI4IiksIF0pKQpzdW1tYXJ5KGxtKGxvc3NfcGN0IH4gUE0gKyBFQ08sIAogICAgICAgICAgIHNyYS5mcmMubXNzLmxzcy5kZlstd2hpY2goc3JhLmZyYy5tc3MubHNzLmRmJFByb2JlID09ICJCU3BwX2NvbXBfMjAwMV8xOC0yOCIpLCBdKSkKCiMgcGxvdApzcmEuZnJjLm1zcy5sc3MuZGYgJT4lCiAgcmVuYW1lKGBNYXNzIGxvc3MgKCUpYCA9IGxvc3NfcGN0KSAlPiUKICBtdXRhdGUoZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKEVDTywgYE1hc3MgbG9zcyAoJSlgLCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbykpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoIndhcm0iID0gMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTYpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyh5ZWFyKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKSW50ZXJlc3RpbmdseSwgaXQgYXBwZWFycyB0aGF0IEFOIHNvaWxzIGhhdmUgcHJvcG9ydGlvbmFsbHkgTEVTUyBtaW5DIGJ5IG1hc3MgdGhhbiBkbyBHUiBvciBCUyBzb2lscywgc2lnbmlmaWNhbnRseSBzbyBhdCBkZXB0aC4gV2h5IHdvdWxkIHRoaXMgYmU/IFBvc3NpYmx5IGJlY2F1c2UgQU4gc29pbHMgaGF2ZSBoaWdoZXIgbG9zc2VzIChET0MpIGR1cmluZyBmcmFjdGlvbmF0aW9uPwoKIyMgRXh0ZXJuYWwgZGF0YQojIyMgQXRtb3NwaGVyZQoKYGBge3IgYXRtMTRjLWRhdGF9CkRhdG0gPC0gcmJpbmQoZ3JhdmVuLCBmdXR1cmUxNEMpCmF0bS4xNGMgPC0gZGF0YS5mcmFtZSh5ZWFyID0gRGF0bVtEYXRtJERhdGUgPiAyMDAwLCAiRGF0ZSJdLAogICAgICAgICAgICAgICAgICAgICAgZDE0YyA9IERhdG1bRGF0bSREYXRlID4gMjAwMCwgIk5IYzE0Il0sCiAgICAgICAgICAgICAgICAgICAgICBUeXBlID0gImF0bW9zcGhlcmUiKQpgYGAKCiMjIyBmcm9tIEMuIFJhc211c3NlbiAoJzAxIEMsIE47ICcwOSAxNEMsIGZyYyBtYXNzLCBDLCBOKQoKYGBge3IgbG9hZC1yYXMtMDEtMDktZGF0YX0KIyBSYXNtdXNzZW4gMjAwMSBkYXRhCiMjIDIwMDEgc3VtbWFyeSBkYXRhCnNvYy4yMDAxIDwtIGRhdGEuZnJhbWUocmVhZF9leGNlbCgiLi4vZGF0YS9leHRlcm5hbC9zcmFfcmFzX3N1bS9zaWVycmFfZGF0YV9zdW1tYXJ5XzIwMjAueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICIyMDAxX2J1bGtfZGF0YSIpKQoKIyBSYXNtdXNzZW4gMjAwOSBkYXRhCiMjIDIwMDkgZnJhY3Rpb24gQywgTiwgbWFzcyBkYXRhCnNyYS4wOS5mcmMucmF3IDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvZXh0ZXJuYWwvc3JhX3Jhc19zdW0vc2llcnJhX2RhdGFfc3VtbWFyeV8yMDIwLnhsc3giLCBzaGVldCA9ICIyMDA5X2ZyYWN0aW9uX2RhdGEiKSAlPiUgdHlwZS5jb252ZXJ0KC4sIGFzLmlzID0gVFJVRSkgJT4lIGRhdGEuZnJhbWUKCiMjIDIwMDkgc3VtbWFyeSBkYXRhCnNyYS4wOS5zdW0gPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9leHRlcm5hbC9zcmFfcmFzX3N1bS9zaWVycmFfZGF0YV9zdW1tYXJ5XzIwMjAueGxzeCIsIHNoZWV0ID0gIkRhdGFfU3VtbWFyeV8yMDE4X3BhcGVyIikgJT4lIHR5cGUuY29udmVydCguLCBhcy5pcyA9IFRSVUUpICU+JSBkYXRhLmZyYW1lCgojIyAyMDA5IGJ1bGsgQwpzb2MuMDkuYmxrQy5kZiA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL2V4dGVybmFsL3NyYV9yYXNfc3VtL3NpZXJyYV9kYXRhX3N1bW1hcnlfMjAyMC54bHN4Iiwgc2hlZXQgPSAiMjAwOV9idWxrX2RhdGEiKSAlPiUgdHlwZS5jb252ZXJ0KC4sIGFzLmlzID0gVFJVRSkgJT4lIGRhdGEuZnJhbWUKCiMgUmFzbXVzc2VuIDIwMDkgMTRDIGRhdGE6IElTUmFECiMjIHJlYWQgSVNSYUQgZngKc3JhLjA5LmlzcmFkIDwtIElTUmFELnJlYWQuZW50cnkoIi4uL2RhdGEvZXh0ZXJuYWwvc3JhX3Jhc19JU1JhRC9SYXNtdXNzZW5fMjAxOC54bHN4IikKCiMgZ2V0IGx5ciBkYXRhCnNyYS4wOS5seXIuZGYgPC0gc3JhLjA5LmlzcmFkJFJhc211c3Nlbl8yMDE4JGxheWVyCgojIGdldCBmcmMgZGF0YQpzcmEuMDkuZnJjLmRmIDwtIG1lcmdlKAogIHNyYS4wOS5pc3JhZCRSYXNtdXNzZW5fMjAxOCRmcmFjdGlvbiwKICBzcmEuMDkuaXNyYWQkUmFzbXVzc2VuXzIwMTgkbGF5ZXJbLCBjKCJwcm9fbmFtZSIsICJseXJfbmFtZSIsICJseXJfYm90IiwgImx5cl90b3AiLCAibHlyX2Nfb3JnIiwgImx5cl9uX3RvdCIsICJseXJfc29jIiwgImx5cl9iZF9zYW1wIiwgImx5cl9vYnNfZGF0ZV95IildLCBieSA9IGMoInByb19uYW1lIiwgImx5cl9uYW1lIikpCgojIyBmaWxsIG1pc3NpbmcgZDE0YyBkYXRhCml4IDwtIHdoaWNoKGlzLm5hKHNyYS4wOS5mcmMuZGYkZnJjXzE0YykgJiAhaXMubmEoc3JhLjA5LmZyYy5kZiRmcmNfZnJhY3Rpb25fbW9kZXJuKSkKc3JhLjA5LmZyYy5kZltpeCwgImZyY18xNGMiXSA8LSBjb252ZXJ0X2ZtX2QxNGMoCiAgZm0gPSBzcmEuMDkuZnJjLmRmW2l4LCAiZnJjX2ZyYWN0aW9uX21vZGVybiJdLCAKICBvYnNfZGF0ZV95ID0gc3JhLjA5LmZyYy5kZltpeCwgImx5cl9vYnNfZGF0ZV95Il0pCgojIyByZXNoYXBlIElTUmFEIGRhdGEgdG8gbWVyZ2Ugd2l0aCBkZW5zLmRmCnNyYS5mcmMuMTRjIDwtIHNyYS4wOS5mcmMuZGYgJT4lCiAgbXV0YXRlKFBNZWNvID0gYXMuY2hhcmFjdGVyKHByb19uYW1lKSwKICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY28sIDEsIDIpLAogICAgICAgICBFQ08gPSBzdWJzdHIoUE1lY28sIDMsIDQpLAogICAgICAgICBwcm9fbmFtZSA9IHBhc3RlMChQTWVjbywgIl8iLCBseXJfb2JzX2RhdGVfeSksCiAgICAgICAgIGZyYyA9IGlmZWxzZShmcmNfcHJvcGVydHkgPT0gImZyZWUgbGlnaHQiLCAiZlBPTSIsIAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGZyY19wcm9wZXJ0eSA9PSAiaGVhdnkiLCAibWluQyIsICJvUE9NIikpLAogICAgICAgICBZZWFyID0gMjAwOSkgJT4lICMgbm90ZSB0aGF0IEdSIHNhbXBsZXMgd2VyZSB0ZWNobmljYWxseSBjb2xsZWN0ZWQgaW4gMjAxMC4uLgogIHNlbGVjdChmcmNfZnJhY3Rpb25fbW9kZXJuLCBmcmNfZnJhY3Rpb25fbW9kZXJuX3NpZ21hLCBmcmNfMTRjLCBmcmNfMTRjX3NpZ21hLCBmcmMsIFBNZWNvLCBQTSwgRUNPLCBZZWFyLCBwcm9fbmFtZSwgbHlyX3RvcCwgbHlyX2JvdCwgbHlyX2JkX3NhbXApICU+JSAKICByZW5hbWUoRjE0QyA9IGZyY19mcmFjdGlvbl9tb2Rlcm4sCiAgICAgICAgIGVyciA9IGZyY19mcmFjdGlvbl9tb2Rlcm5fc2lnbWEsCiAgICAgICAgIGZyY18xNGNfZXJyID0gZnJjXzE0Y19zaWdtYSkgCmBgYAoKIyBBbmFseXNpcwojIyBNaXNjLiBmdW5jdGlvbnMKCmBgYHtyIGRlZmluZS1DLXNwbGluZS1meHN9CiMgZGVwdGggc3BsaW5lIGZvciBDIHBlcmNlbnQsIHdoZXJlIGQgPSB2ZWN0b3Igb2YgbGF5ZXIgYm90dG9tIGRlcHRocwpDc3BsaW5lLmZ4IDwtIGZ1bmN0aW9uKGRmLCB2YXIubmFtZSwgZCA9IGMoMTAsIDIwLCAzMCkpIHsKICBiaW5kX3Jvd3MobGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIGRlcHRocyh4KSA8LSBwcm9fbmFtZSB+IGx5cl90b3AgKyBseXJfYm90CiAgICB4Lm1wcyA8LSBtcHNwbGluZSh4LCB2YXIubmFtZSA9IHZhci5uYW1lLCBkID0gdChjKDAsIGQpKSkKICAgIHguc3RkIDwtIHQoeC5tcHMkdmFyLnN0ZCkKICAgIGRmIDwtIGRhdGEuZnJhbWUoY19wY3QgPSB4LnN0ZCwgZGVwdGggPSByb3cubmFtZXMoeC5zdGQpKQogICAgZGYkZGVwdGggPC0gZ3N1YigiIFteIF0qJCIsICIiLCBkZiRkZXB0aCkKICAgIHJldHVybihkZlsxOmxlbmd0aChkKSwgXSkKICB9KSwgLmlkID0gInByb19uYW1lIikKfQoKIyBkZXB0aCBzcGxpbmUgZm9yIG1vbm90b25pYyBjdW11bGF0aXZlIEMgc3RvY2tzOyBOQjogaW5wdXQgbXVzdCBiZSAyLWNvbCBkZiB3LyBkZXB0aCAoMSkgYW5kIGNtdHYgU09DICgyKQpTT0NzcGxpbmUuZnggPC0gZnVuY3Rpb24oeCwgZGVwdGhzLCBzb2MpIHsKICB0MCA8LSBkYXRhLmZyYW1lKGx5cl9ib3QgPSAwKQogIHQwW1tzb2NdXSA8LSAwCiAgdDAueCA8LSByYmluZCh0MCwgeCkKICAKICAjIGZpdCBtb25vdG9uaWMgY3ViaWMgc3BsaW5lCiAgc3AgPC0gc3BsaW5lKHQwLngsIG1ldGhvZCA9ICJoeW1hbiIpIAogIAogICMgY29udmVydCB0byBjbGFzcyAic3BsaW5lIiB3aXRoIHNtb290aC5zcGxpbmUgZnhuCiAgc3Auc3MgPC0gc21vb3RoLnNwbGluZShzcCwgYWxsLmtub3RzID0gVFJVRSkgCiAgbWF4LmQgPC0gbWF4KHhbICwgMV0pCiAgaWYgKG1heC5kIDwgMzEpIHsKICAgIG1heC5kIDwtIDMxCiAgfQogIAogICMgcHJlZGljdCBhdCBnaXZlbiBkZXB0aHMgKGxpbmVhciBiZXlvbmQgbGFzdCBtZWFzdXJlZCBkZXB0aCkKICBzcHAgPC0gcHJlZGljdChzcC5zcywgZGVwdGhzKSAKICBkZiA8LSBkYXRhLmZyYW1lKHNwcCkKICBjb2xuYW1lcyhkZikgPC0gYygibHlyX2JvdCIsICJseXJfc29jIikgCiAgCiAgIyBjYWxjdWxhdGUgc29jIHBlciBpbmNyZW1lbnQgZnJvbSBjbXR2IHZhbHVlcwogIGZvcihpIGluIHNlcV9hbG9uZyhkZiRseXJfYm90KSkgewogICAgaWYoaSA9PSAxKSB7CiAgICAgIGRmJGx5cl9zb2NbaV0gPC0gZGYkbHlyX3NvY1tpXQogICAgfSBlbHNlIHsKICAgICAgZGYkbHlyX3NvY1tpXSA8LSBkZiRseXJfc29jW2kgKyAxXSAtIGRmJGx5cl9zb2NbaV0KICAgIH0KICB9CiAgCiAgIyByZXR1cm4gCiAgZGYkbHlyX2JvdCA8LSBkZiRseXJfYm90ICsgMQogIHJldHVybihkZlstbGVuZ3RoKGRmJGx5cl9zb2MpLCBdKQp9CmBgYAoKIyMgQnVsayBDCiMjIyAyMDAxCmBgYHtyIGJsa2MtZGF0YS0yMDAxfQojIEZyYWN0aW9uIHNhbXBsZXMgY29tYmluZWQgMC0zIGFuZCAzLTggZGVwdGggaW5jcmVtZW50cyBmb3IgQlNyZiBhbmQgR1JyZgojIyBmdW5jdGlvbiBmb3IgY2FsY3VsYXRpbmcgZGVwdGgtd2VpZ2h0ZWQgYXZlcmFnZSBvZiBmaXJzdCB0d28gZGVwdGggaW5jcmVtZW50IEMgY29udGVudApkMWQyLmZ4IDwtIGZ1bmN0aW9uKGRmKSB7CiAgZDFkMiA8LSBkYXRhLmZyYW1lKElEID0gcGFzdGUoZGYkUE1lY29bMV0sIGRmJHByb19yZXBbMV0sIGRmJGx5cl90b3BbMV0sIGRmJGx5cl9ib3RbMl0sIHNlcCA9ICJfIiksCiAgICAgICAgICAgICAgICAgICAgIFBNZWNvID0gZGYkUE1lY29bMV0sCiAgICAgICAgICAgICAgICAgICAgIG1hc3Nfa2dtMiA9IHN1bShkZiRtYXNzX2tnbTJbMV0sIGRmJG1hc3Nfa2dtMlsyXSksCiAgICAgICAgICAgICAgICAgICAgIGNfcGN0ID0gc3VtKGRmJGNfcGN0WzFdICogKChkZiRseXJfYm90WzFdIC0gZGYkbHlyX3RvcFsxXSkgLyBkZiRseXJfYm90WzJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGYkY19wY3RbMl0gKiAoKGRmJGx5cl9ib3RbMl0gLSBkZiRseXJfdG9wWzJdKSAvIGRmJGx5cl9ib3RbMl0pKSwKICAgICAgICAgICAgICAgICAgICAgbHlyX3NvY19rZ20yID0gc3VtKGRmJGx5cl9zb2Nfa2dtMlsxXSwgZGYkbHlyX3NvY19rZ20yWzJdKSwKICAgICAgICAgICAgICAgICAgICAgcHJvX25hbWUgPSBkZiRwcm9fbmFtZVsxXSwKICAgICAgICAgICAgICAgICAgICAgbHlyX3RvcCA9IGRmJGx5cl90b3BbMV0sCiAgICAgICAgICAgICAgICAgICAgIGx5cl9ib3QgPSBkZiRseXJfYm90WzJdKQogIHJldHVybihyYmluZChkMWQyLAogICAgICAgICAgICAgICBkZlszOm5yb3coZGYpLCBdKSkKfQoKIyBDcmVhdGUgbGlzdApzb2MuMjAwMS5scyA8LSBsYXBwbHkoc3BsaXQoc29jLjIwMDEsIHNvYy4yMDAxJFBNZWNvKSwgZnVuY3Rpb24oZGYpIHsKICAKICAjIHJlbW92ZSBOQXMKICBkZiA8LSB0eXBlLmNvbnZlcnQoZGZbY29tcGxldGUuY2FzZXMoZGYpLCBdKQogIAogICMgZmlsdGVyIDwgMzZjbSwgcmVuYW1lIGNfcGN0LCBhZGQgbWFzcyBhbmQgc29jIHN0b2NrIGNvbHVtbnMKICBkZiA8LSBkZiAlPiUKICAgIGZpbHRlcihseXJfYm90IDwgMzYpICU+JQogICAgcmVuYW1lKGNfcGN0ID0gQy4pICU+JQogICAgbXV0YXRlKG1hc3Nfa2dtMiA9IGJkLmcuY20zICogKGx5cl9ib3QgLSBseXJfdG9wKSAqIGZpbmUuZWFydGguICogLjEsCiAgICAgICAgICAgbHlyX3NvY19rZ20yID0gbWFzc19rZ20yICogY19wY3QgKiAxMF4tMiwKICAgICAgICAgICBwcm9fbmFtZSA9IHBhc3RlKFBNZWNvLCBwcm9fcmVwLCBzZXAgPSAiXyIpKSAlPiUKICAgIHNlbGVjdChJRCwgUE1lY28sIG1hc3Nfa2dtMiwgY19wY3QsIGx5cl9zb2Nfa2dtMiwgcHJvX25hbWUsIGx5cl90b3AsIGx5cl9ib3QpCiAgCiAgIyBjb21iaW5lIDAtMywgMy04IGNtIGRlcHRocyBmb3IgR1JyZiwgQlNyZgogIGlmIChkZiRQTWVjb1sxXSA9PSAiR1JyZiIgfCBkZiRQTWVjb1sxXSA9PSAiQlNyZiIpIHsKICAgIGRmPC0gYmluZF9yb3dzKGxhcHBseShzcGxpdChkZiwgZGYkcHJvX25hbWUpLCBkMWQyLmZ4KSkKICB9CgogICMgY2FsY3VsYXRlIGNtdHYgc29jIHN0b2NrcwogIGxzIDwtIHNwbGl0KGRmLCBkZiRwcm9fbmFtZSkKICBscyA8LSBsYXBwbHkobHMsIGZ1bmN0aW9uKHgpIHsKICAgIHggPC0geFtvcmRlcih4JGx5cl9ib3QpLCBdICMgbWFrZSBzdXJlIHRvIG9yZGVyIGRhdGEKICAgIHgkbHlyX3NvY19jbXR2IDwtIE5BCiAgICBmb3IoaSBpbiBzZXFfYWxvbmcoeCRseXJfYm90KSkgewogICAgICBpZihpID09IDEpIHsKICAgICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2Nfa2dtMltpXQogICAgICB9IGVsc2UgewogICAgICAgIHgkbHlyX3NvY19jbXR2W2ldIDwtIHgkbHlyX3NvY19rZ20yW2ldICsgeCRseXJfc29jX2NtdHZbaS0xXSAKICAgICAgfQogICAgfQogICAgcmV0dXJuKHgpCiAgfSkKICByZXR1cm4odW5zcGxpdChscywgZGYkcHJvX25hbWUpKQp9KQoKIyBzdW1tYXJpemUKc29jLjIwMDEuc3VtLmRmIDwtIGJpbmRfcm93cyhzb2MuMjAwMS5scykgJT4lCiAgZ3JvdXBfYnkoUE1lY28sIGx5cl90b3AsIGx5cl9ib3QpICU+JQogIHN1bW1hcml6ZShhY3Jvc3MoYyhtYXNzX2tnbTIsIGNfcGN0LCBseXJfc29jX2tnbTIsIGx5cl9zb2NfY210diksIAogICAgICAgICAgICAuZm5zID0gbGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBtdXRhdGUoSUQyID0gcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCkpCmBgYAoKIyMjIDIwMDkKYGBge3IgYy1kYXRhLTIwMDl9CiMgY2FsY3VsYXRlIGN1bXVsYXRpdmUgc29jIHN0b2NrcyBmb3IgJzA5IGRhdGEKc3JhLjA5Lmx5ci5DIDwtIHVuc3BsaXQobGFwcGx5KAogIHNwbGl0KHNyYS4wOS5mcmMuZGYsIHNyYS4wOS5mcmMuZGYkcHJvX25hbWUpLCBmdW5jdGlvbih4KSB7CiAgICB4IDwtIHhbb3JkZXIoeCRseXJfYm90KSwgXSAjIG1ha2Ugc3VyZSB0byBvcmRlciBkYXRhCiAgICB4JGx5cl9zb2Nfa2dtMiA8LSB4JGx5cl9zb2MgKiAxMAogICAgeCRseXJfc29jX2NtdHYgPC0gTkEKICAgIGZvcihpIGluIHNlcV9hbG9uZyh4JGx5cl9ib3QpKSB7CiAgICAgIGlmKGkgPT0gMSkgewogICAgICAgIHgkbHlyX3NvY19jbXR2W2ldIDwtIHgkbHlyX3NvY19rZ20yW2ldCiAgICAgIH0gZWxzZSB7CiAgICAgICAgeCRseXJfc29jX2NtdHZbaV0gPC0geCRseXJfc29jX2tnbTJbaV0gKyB4JGx5cl9zb2NfY210dltpLTFdIAogICAgICB9CiAgICB9CiAgICByZXR1cm4oeCkKICB9KSwgc3JhLjA5LmZyYy5kZiRwcm9fbmFtZSkgJT4lCiAgcmVuYW1lKFBNZWNvID0gcHJvX25hbWUsCiAgICAgICAgIGZyY19jX3BjdCA9IGZyY19jX3BlcmMpICU+JQogIG11dGF0ZShmcmMgPSBpZmVsc2UoZnJjX3Byb3BlcnR5ID09ICJmcmVlIGxpZ2h0IiwgIkZQT00iLCAKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShmcmNfcHJvcGVydHkgPT0gImhlYXZ5IiwgIk1PTSIsICJPUE9NIikpLAogICAgICAgICBQTSA9IHN1YnN0cihQTWVjbywgMSwgMiksCiAgICAgICAgIEVDTyA9IGZhY3RvcihzdWJzdHIoUE1lY28sIDMsIDQpLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSwKICAgICAgICAgbWFzc19jX2cgPSBseXJfc29jX2tnbTIgKiBmcmNfY19wY3QgKiAxMF4tMikKYGBgCgojIyMgMjAxOQoKYGBge3IgbG9hZC0yMDE5LXNvY30KbG9hZCgiL1VzZXJzL2plZmYvc3JhLXRzL3NvdXJjZS9zcmEuMjAxOS5scy5SRGF0YSIpCnNyYS5zb2MuMjAxOS5kZiA8LSBiaW5kX3Jvd3MobGFwcGx5KHNyYS4yMDE5LmxzLCBmdW5jdGlvbihkZikgewogIGRmICU+JQogICAgZmlsdGVyKGx5cl9ib3QgPCAzMSkgJT4lCiAgICBncm91cF9ieShQTSwgRUNPLCBseXJfYm90KSAlPiUKICAgIHN1bW1hcml6ZShhY3Jvc3MoYyhDLCBseXJfc29jKSwgbWVhbiksIC5ncm91cHMgPSAiZHJvcCIpICU+JQogICAgcmVuYW1lKGNfcGN0X2x5ciA9IEMpCn0pKQpgYGAKCiMjIEZyYWN0aW9uIEMKIyMjIEMsIENOIHByb2ZpbGVzCgpgYGB7ciBwbG90LWMtbi1jbn0KIyBwbG90IGRlcHRoIHByb2ZpbGVzCiMgcGxvdCBmeApmcmMucHJvLnBsb3QgPC0gZnVuY3Rpb24oZGYsIHllYXIsIGZyYWN0aW9uLCB4KSB7CiAgcXVvX3ggPC0gc3ltKHgpCiAgeGxhYiA8LSBpZmVsc2UoeCA9PSAiQ04iLCAiQ04iLCBwYXN0ZSh4LCAiKCUpIikpCiAgZGYkRUNPIDwtIGZhY3RvcihkZiRFQ08sIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpCiAgZGYgPC0gZGZbb3JkZXIoZGYkbHlyX2JvdCksIF0KICBkZiRtaWRkZXB0aCA8LSBkZiRseXJfdG9wICsgKGRmJGx5cl9ib3QgLSBkZiRseXJfdG9wKSAvIDIKICBnZ3Bsb3QoZGYsIGFlcyghISBxdW9feCwgbWlkZGVwdGgsIGNvbG9yID0gUE0sIHNoYXBlID0gRUNPKSkgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogICAgZ2VvbV9wb2ludChzaXplID0gMykgKwogICAgZ2VvbV9wYXRoKCkgKwogICAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoMzAsIDApKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSBhbmRlc2l0ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSBncmFuaXRlKSkgKwogICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiQ2xpbWF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygicHAiID0gIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJmIiA9ICJjb2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAiY29vbCIpLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoInBwIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZiIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2YiID0gMTcpKSArCiAgICB4bGFiKHhsYWIpICsKICAgIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgICBnZ3RpdGxlKHBhc3RlKHllYXIsIGZyYWN0aW9uKSkgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQp9CgojIENvbWJpbmUgcHJvZmlsZXMgZm9yIHBsb3R0aW5nCmZyYy5DLjAxLnBsb3QubHMgPC0gbGFwcGx5KHNyYS5mcmMuMjAwMS5scywgYmluZF9yb3dzLCAuaWQgPSAiZnJhY3Rpb24iKQpsYXBwbHkoc2VxX2Fsb25nKGZyYy5DLjAxLnBsb3QubHMpLCBmdW5jdGlvbihpKSB7CiAgZnJjLnByby5wbG90KGZyYy5DLjAxLnBsb3QubHNbW2ldXSwgMjAwMSwgbmFtZXMoZnJjLkMuMDEucGxvdC5scylbaV0sICJDIikKfSkKCmZyYy5DLjE5LnBsb3QubHMgPC0gbGFwcGx5KHNyYS5mcmMuMjAxOS5scywgYmluZF9yb3dzLCAuaWQgPSAiZnJhY3Rpb24iKQpsYXBwbHkoc2VxX2Fsb25nKGZyYy5DLjE5LnBsb3QubHMpLCBmdW5jdGlvbihpKSB7CiAgZnJjLnByby5wbG90KGZyYy5DLjE5LnBsb3QubHNbW2ldXSwgMjAxOSwgbmFtZXMoZnJjLkMuMTkucGxvdC5scylbaV0sICJDIikKfSkKCiMgQ2FsY3VsYXRlIGFuZCBwbG90IENOCmxhcHBseShzZXFfYWxvbmcoZnJjLkMuMDEucGxvdC5scyksIGZ1bmN0aW9uKGkpIHsKICBmcmMuQy4wMS5wbG90LmxzW1tpXV1bWyJDTiJdXSA8LSBmcmMuQy4wMS5wbG90LmxzW1tpXV1bWyJDIl1dIC8gZnJjLkMuMDEucGxvdC5sc1tbaV1dW1siTiJdXQogIGZyYy5wcm8ucGxvdChmcmMuQy4wMS5wbG90LmxzW1tpXV0sIDIwMDEsIG5hbWVzKGZyYy5DLjAxLnBsb3QubHMpW2ldLCAiQ04iKQp9KQpsYXBwbHkoc2VxX2Fsb25nKGZyYy5DLjE5LnBsb3QubHMpLCBmdW5jdGlvbihpKSB7CiAgZnJjLkMuMTkucGxvdC5sc1tbaV1dW1siQ04iXV0gPC0gZnJjLkMuMTkucGxvdC5sc1tbaV1dW1siQyJdXSAvIGZyYy5DLjE5LnBsb3QubHNbW2ldXVtbIk4iXV0KICBmcmMucHJvLnBsb3QoZnJjLkMuMTkucGxvdC5sc1tbaV1dLCAyMDE5LCBuYW1lcyhmcmMuQy4xOS5wbG90LmxzKVtpXSwgIkNOIikKfSkKYGBgCgojIyMgQyBkaXN0cmlidXRpb24KCmBgYHtyIG1lcmdlLWZyYy1tYXNzLUN9CiMjIG1lcmdlIEMgYW5kIG1hc3MgZGF0YQojICcwMQpzcmEuZnJjLm1zcy5DLjAxLmRmIDwtIG1lcmdlKAogIGJpbmRfcm93cygKICAgIGxhcHBseShzcmEuZnJjLjIwMDEubHMsIGZ1bmN0aW9uKGxzKSBiaW5kX3Jvd3MobHMsIC5pZCA9ICJQTWVjbyIpKSwgLmlkID0gImZyYyIpLAogIHNyYS5mcmMubXNzLmxvbmcuMDEuZGYsIGJ5ID0gYygieWVhciIsICJQTWVjbyIsICJseXJfYm90IiwgImx5cl90b3AiLCAiZnJjIikpICU+JSAKICBtdXRhdGUoSUQyID0gc3ViKCJjb21wXzIwMDFfIiwgeCA9IElELCByZXBsYWNlbWVudCA9ICIiKSkKCiMgY2FsY3VsYXRlIEMgd2VpZ2h0cwpzcmEuZnJjLm1zcy5DLjAxLmRmJG1hc3NfY19nIDwtIHNyYS5mcmMubXNzLkMuMDEuZGYkbWFzc19zdW0gKiAoc3JhLmZyYy5tc3MuQy4wMS5kZiRtYXNzX3BjdCAvIDEwMCkgKiAoc3JhLmZyYy5tc3MuQy4wMS5kZiRDIC8gMTAwKQoKIyBjYWxjIHN5bnRoZXRpYyBseXJfYyAoYXMgc3VtIG9mIGZyYyBjIG1hc3NlcykgYW5kIHBlcmNlbnQKaWYgKCEoImx5cl9jX21hc3Nfc3luIiAlaW4lIG5hbWVzKHNyYS5mcmMubXNzLkMuMDEuZGYpKSkgewogIHNyYS5mcmMubXNzLkMuMDEuZGYgPC0gc3JhLmZyYy5tc3MuQy4wMS5kZiAlPiUKICAgIGdyb3VwX2J5KHllYXIsIFBNZWNvLCBseXJfYm90KSAlPiUKICAgIHN1bW1hcml6ZShseXJfY19tYXNzX3N5biA9IHN1bShtYXNzX2NfZyksIC5ncm91cHMgPSAiZHJvcCIpICU+JQogICAgcmlnaHRfam9pbiguLCBzcmEuZnJjLm1zcy5DLjAxLmRmLCBieSA9IGMoInllYXIiLCAiUE1lY28iLCAibHlyX2JvdCIpKQp9CnNyYS5mcmMubXNzLkMuMDEuZGYkZnJjX2NfcGN0IDwtIHNyYS5mcmMubXNzLkMuMDEuZGYkbWFzc19jX2cgLyBzcmEuZnJjLm1zcy5DLjAxLmRmJGx5cl9jX21hc3Nfc3luCgojIGFkZCBseXIgQwpzcmEuZnJjLm1zcy5DLjAxLmRmJGx5cl9jX3BjdCA8LSB1bmxpc3Qoc29jLjIwMDEuc3VtLmRmWwogIG1hdGNoKHNyYS5mcmMubXNzLkMuMDEuZGYkSUQyLCBzb2MuMjAwMS5zdW0uZGYkSUQyKSwgImNfcGN0X21lYW4iXSkKCiMgcmVsZXZlbCBmcmFjdGlvbiBmYWN0b3IKc3JhLmZyYy5tc3MuQy4wMS5kZiRmcmMgPC0gZmFjdG9yKHNyYS5mcmMubXNzLkMuMDEuZGYkZnJjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkZQT00iLCAiT1BPTSIsICJNT00iKSkKCiMgY29udmVydCB0byBkYXRhLmZyYW1lCnNyYS5mcmMubXNzLkMuMDEuZGYgPC0gZGF0YS5mcmFtZShzcmEuZnJjLm1zcy5DLjAxLmRmKQoKIyBhZGQgbWlkZGVwdGgKc3JhLmZyYy5tc3MuQy4wMS5kZiRtaWRkZXB0aCA8LSBzcmEuZnJjLm1zcy5DLjAxLmRmJGx5cl90b3AgKwogIChzcmEuZnJjLm1zcy5DLjAxLmRmJGx5cl9ib3QgLSBzcmEuZnJjLm1zcy5DLjAxLmRmJGx5cl90b3ApIC8gMgoKIyMgJzE5CnNyYS5mcmMubXNzLkMuMTkuZGYgPC0gbWVyZ2UoCiAgYmluZF9yb3dzKAogICAgbGFwcGx5KHNyYS5mcmMuMjAxOS5scywgZnVuY3Rpb24obHMpIGJpbmRfcm93cyhscywgLmlkID0gIlBNZWNvIikpLCAuaWQgPSAiZnJjIiksCiAgc3JhLmZyYy5tc3MubG9uZy4xOS5kZiwgYnkgPSBjKCJ5ZWFyIiwgIlBNZWNvIiwgImx5cl9ib3QiLCAibHlyX3RvcCIsICJmcmMiKSkgJT4lIAogIG11dGF0ZShJRDIgPSBzdWIoImNvbXBfMjAxOV8iLCB4ID0gSUQsIHJlcGxhY2VtZW50ID0gIiIpKQoKIyBjYWxjdWxhdGUgQyB3ZWlnaHRzCnNyYS5mcmMubXNzLkMuMTkuZGYkbWFzc19jX2cgPC0gc3JhLmZyYy5tc3MuQy4xOS5kZiRtYXNzX3N1bSAqKHNyYS5mcmMubXNzLkMuMTkuZGYkbWFzc19wY3QgLyAxMDApICogKHNyYS5mcmMubXNzLkMuMTkuZGYkQyAvIDEwMCkKCiMgYWRkIGx5ciBDCnNyYS5mcmMubXNzLkMuMTkuZGYkbHlyX2NfcGN0IDwtIHVubGlzdChzcmEuYmxrLjIwMTkuc3VtLmRmWwogIG1hdGNoKHNyYS5mcmMubXNzLkMuMTkuZGYkSUQyLCBzcmEuYmxrLjIwMTkuc3VtLmRmJElEMiksICJDX21lYW4iXSkKCiMgY2FsYyBzeW50aGV0aWMgbHlyX2MgKGFzIHN1bSBvZiBmcmMgYyBtYXNzZXMpIGFuZCBwZXJjZW50CmlmICghKCJseXJfY19tYXNzX3N5biIgJWluJSBuYW1lcyhzcmEuZnJjLm1zcy5DLjE5LmRmKSkpIHsKICBzcmEuZnJjLm1zcy5DLjE5LmRmIDwtIHNyYS5mcmMubXNzLkMuMTkuZGYgJT4lCiAgICBncm91cF9ieSh5ZWFyLCBQTWVjbywgbHlyX2JvdCkgJT4lCiAgICBzdW1tYXJpemUobHlyX2NfbWFzc19zeW4gPSBzdW0obWFzc19jX2cpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICAgIHJpZ2h0X2pvaW4oLiwgc3JhLmZyYy5tc3MuQy4xOS5kZiwgYnkgPSBjKCJ5ZWFyIiwgIlBNZWNvIiwgImx5cl9ib3QiKSkKfQpzcmEuZnJjLm1zcy5DLjE5LmRmJGZyY19jX3BjdCA8LSBzcmEuZnJjLm1zcy5DLjE5LmRmJG1hc3NfY19nIC8gc3JhLmZyYy5tc3MuQy4xOS5kZiRseXJfY19tYXNzX3N5bgpzcmEuZnJjLm1zcy5DLjE5LmRmJEVDTyA8LSBmYWN0b3Ioc3JhLmZyYy5tc3MuQy4xOS5kZiRFQ08sIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpCmBgYAoKYGBge3IgcGxvdC1mcmNDLXBjdC1meH0KIyBib3ggcGxvdCBmeApmcmNfY19wY3QucGxvdC5meCA8LSBmdW5jdGlvbihkZiwgZmlsbF92YXIpIHsKICAKICAjIHNldCBmaWxsIHZhcmlhYmxlIGFuZCBndWlkZXMKICBxdW9fZmlsbF92YXIgPC0gc3ltKGZpbGxfdmFyKQogIGlmIChmaWxsX3ZhciA9PSAiUE0iKSB7CiAgICBmaWxsX3ZhbHMgPC0gYygiQU4iID0gYW5kZXNpdGUsICJCUyIgPSBiYXNhbHQsICJHUiIgPSBncmFuaXRlKQogIH0gZWxzZSB7CiAgICBmaWxsX3ZhbHMgPC0gYygicHAiID0gd2FybSwgIndmIiA9IGNvb2wsICJyZiIgPSBjb2xkKQogIH0KICAKICAjIHBsb3QKIGRmICU+JQogIG11dGF0ZShmcmMgPSBmYWN0b3IoZnJjLCBsZXZlbHMgPSBjKCJGUE9NIiwgIk9QT00iLCAiTU9NIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGZyYywgZnJjX2NfcGN0KSkgKwogIGdlb21fYm94cGxvdChhZXMoZmlsbCA9ICEhIHF1b19maWxsX3ZhciksIHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGZpbGxfdmFscykgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZGVwdGgpKSArCiAgeWxhYigiQyBwYXJ0aXRpb25pbmcgKCUpIikgKwogIHhsYWIoTlVMTCkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpIAp9CmBgYAoKYGBge3IgcGxvdC1mcmNDLXBjdC0wMX0KIyAyMDAxCiMjIHByZXAgZngKc3JhLmZyYy5tc3MuQy4wMS5wcmVwLmZ4IDwtIGZ1bmN0aW9uKGRmKSB7CiAgYmluZF9yb3dzKAogICAgbGFwcGx5KHNwbGl0KGRmLCBkZiRQTWVjbyksIGZ1bmN0aW9uKGQpIHsKICAgICAgYmluZF9yb3dzKGxhcHBseShzcGxpdChkLCBkJGZyYyksIGZ1bmN0aW9uKGYpIHsKICAgICAgICBmIDwtIGZbb3JkZXIoZiRseXJfYm90KSwgXQogICAgICAgIGYkZGVwdGggPC0gc2VxKDEsIG5yb3coZikpCiAgICAgICAgcmV0dXJuKGYpCiAgICAgIH0pKQogICAgfSkpCn0KCiMjIFBNCmZyY19jX3BjdC5wbG90LmZ4KHNyYS5mcmMubXNzLkMuMDEucHJlcC5meChzcmEuZnJjLm1zcy5DLjAxLmRmKSwgCiAgICAgICAgICAgICAgICAgIGZpbGxfdmFyID0gIlBNIikKCiMjIEVDTwpmcmNfY19wY3QucGxvdC5meChzcmEuZnJjLm1zcy5DLjAxLnByZXAuZngoc3JhLmZyYy5tc3MuQy4wMS5kZiksIAogICAgICAgICAgICAgICAgICBmaWxsX3ZhciA9ICJFQ08iKQpgYGAKCmBgYHtyIHBsb3QtZnJjQy1wY3QtMDl9CiMgMjAwOQpmcmNfY19wY3QucGxvdC5meChzcmEuZnJjLm1zcy5DLjAxLnByZXAuZngoc3JhLjA5Lmx5ci5DKSwgIlBNIikKZnJjX2NfcGN0LnBsb3QuZngoc3JhLmZyYy5tc3MuQy4wMS5wcmVwLmZ4KHNyYS4wOS5seXIuQyksICJFQ08iKQpgYGAKCmBgYHtyIHBsb3QtZnJjQy1wY3QtMTl9CiMgMjAxOQpmcmNfY19wY3QucGxvdC5meChzcmEuZnJjLm1zcy5DLjE5LmRmLCAiUE0iKQpmcmNfY19wY3QucGxvdC5meChzcmEuZnJjLm1zcy5DLjE5LmRmLCAiRUNPIikKYGBgCgpgYGB7ciBjLWRpc3QtcG0tZWNvfQpzcmEuZnJjLm1zcy5DLjE5LmRmICU+JQogIG11dGF0ZShjX21hc3Nfd3QgPSBtYXNzX2NfZyAvIHN1bShtYXNzX2NfZyksCiAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJXQVJNIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJDT09MIiwgIkNPTEQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJXQVJNIiwgIkNPT0wiLCAiQ09MRCIpKSwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkgJT4lCiAgZ3JvdXBfYnkocG0sIGVjbywgZnJjKSAlPiUKICBzdW1tYXJpemUoZnJjX2NfcGN0XzMwID0gcm91bmQod2VpZ2h0ZWQubWVhbihmcmNfY19wY3QsIGNfbWFzc193dCkgKiAxMDAsIDApLAogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBtdXRhdGUoZnJjID0gZmFjdG9yKGZyYywgbGV2ZWxzID0gYygiRlBPTSIsICJNT00iLCAiT1BPTSIpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiZnJlZSBsaWdodCIsICJoZWF2eSIsICJvY2NsdWRlZCBsaWdodCIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhwbSwgZnJjX2NfcGN0XzMwKSkgKwogIGdlb21fY29sKGFlcyhmaWxsID0gcG0pLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZWNvKSwgcm93cyA9IHZhcnMoZnJjKSkgKwogIHlsYWIoIkMgcGFydGl0aW9uaW5nICglKSIpICsKICB4bGFiKE5VTEwpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTIpLAogICAgICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBhbmdsZSA9IDAsIHNpemUgPSAxMiksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSAid2hpdGUiKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSAKYGBgCgpgYGB7ciBjYWxjLWZyYy1DLWRpc3RyLWVycn0KIyBtYWtlIHdpZGUgZGF0YWZyYW1lIGZvciAyMDE5IGZyYyBkYXRhCm1lcmdlLnZhcnMgPC0gYygieWVhciIsICJQTSIsICJFQ08iLCAibHlyX2JvdCIpCnNyYS5mcmMuMjAxOS5kZiA8LSBtZXJnZSgKICBtZXJnZShiaW5kX3Jvd3Moc3JhLmZyYy4yMDE5LmxzJEZQT00pWywgYyhtZXJnZS52YXJzLCAiQyIsICJOIildLAogICAgICAgIGJpbmRfcm93cyhzcmEuZnJjLjIwMTkubHMkT1BPTSlbLCBjKG1lcmdlLnZhcnMsICJDIiwgIk4iKV0sCiAgICAgICAgYnkgPSBtZXJnZS52YXJzLCBzdWZmaXhlcyA9IGMoIl9mUE9NIiwgIl9vUE9NIikpLAogIGJpbmRfcm93cyhzcmEuZnJjLjIwMTkubHMkTU9NKVssIGMobWVyZ2UudmFycywgIkMiLCAiTiIpXSwgYnkgPSBtZXJnZS52YXJzKSAlPiUKICByZW5hbWUoQ19taW5DID0gQywgTl9taW5DID0gTikKCiMgZmlsbCBtaXNzaW5nIG9QT00gZGF0YQpzcmEuZnJjLm1zcy53aWRlLmZpbGwuZGYgPC0gc3JhLmZyYy5tc3MubHNzLmRmCnNyYS5mcmMubXNzLndpZGUuZmlsbC5kZiRvUE9NIDwtIGlmZWxzZSgKICBpcy5uYShzcmEuZnJjLm1zcy53aWRlLmRmJE9QT00pLAogIHNyYS5mcmMubXNzLndpZGUuZGYkd3RfZyAtIChzcmEuZnJjLm1zcy53aWRlLmRmJEZQT00gKyBzcmEuZnJjLm1zcy53aWRlLmRmJE1PTSksCiAgc3JhLmZyYy5tc3Mud2lkZS5kZiRPUE9NKQoKIyBjYWxjdWxhdGUgbWFzcyBwcmVjZW50YWdlcwpzcmEuZnJjLm1zcy53aWRlLmZpbGwuZGYgPC0gc3JhLmZyYy5tc3Mud2lkZS5maWxsLmRmICU+JQogIG11dGF0ZShmUE9NX21hc3NfZnJhYyA9IEZQT00gLyB3dF9nLAogICAgICAgICBvUE9NX21hc3NfZnJhYyA9IE9QT00gLyB3dF9nLAogICAgICAgICBtaW5DX21hc3NfZnJhYyA9IE1PTSAvIHd0X2csCiAgICAgICAgIFBNZWNvID0gcGFzdGUwKFBNLCBFQ08pKQoKIyAjIG1vZGVsCiMgc3VtbWFyeShsbShmUE9NX21hc3NfZnJhYyB+IFBNICsgRUNPLCAKIyAgICAgICAgICAgIHNyYS5mcmMubXNzLndpZGUuZmlsbC5kZltzcmEuZnJjLm1zcy53aWRlLmZpbGwuZGYkbHlyX2JvdCA9PSAxMCAmIHNyYS5mcmMubXNzLndpZGUuZmlsbC5kZiR5ZWFyID09IDIwMTksXSkpCiMgc3VtbWFyeShsbShvUE9NX21hc3NfZnJhYyB+IFBNICsgRUNPLCAKIyAgICAgICAgICAgIHNyYS5mcmMubXNzLndpZGUuZmlsbC5kZltzcmEuZnJjLm1zcy53aWRlLmZpbGwuZGYkbHlyX2JvdCA9PSAxMCAmIHNyYS5mcmMubXNzLndpZGUuZmlsbC5kZiR5ZWFyID09IDIwMTksXSkpCiMgc3VtbWFyeShsbShtaW5DX21hc3NfZnJhYyB+IFBNICsgRUNPLCAKIyAgICAgICAgICAgIHNyYS5mcmMubXNzLndpZGUuZmlsbC5kZltzcmEuZnJjLm1zcy53aWRlLmZpbGwuZGYkbHlyX2JvdCA9PSAxMCAmIHNyYS5mcmMubXNzLndpZGUuZmlsbC5kZiR5ZWFyID09IDIwMTksXSkpCgojIHBsb3QKc3JhLmZyYy5tc3MuZmlsbC5wbG90LmRmIDwtIHNyYS5mcmMubXNzLndpZGUuZmlsbC5kZiAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGNvbnRhaW5zKCJtYXNzX2ZyYWMiKSwgbmFtZXNfdG8gPSAiRnJhY3Rpb24iLCB2YWx1ZXNfdG8gPSAiTWFzcyBwZXJjZW50IikgJT4lCiAgbXV0YXRlKEZyYWN0aW9uID0gZmFjdG9yKEZyYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJmUE9NX21hc3NfZnJhYyIsICJvUE9NX21hc3NfZnJhYyIsICJtaW5DX21hc3NfZnJhYyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJmUE9NX21hc3NfZnJhYyIgPSAiZlBPTSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9QT01fbWFzc19mcmFjIiA9ICJvUE9NIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbkNfbWFzc19mcmFjIiA9ICJtaW5DIikpKQoKIyAyMDE5CnNyYS5mcmMubXNzLmZpbGwucGxvdC5kZiAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDE5KSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFBNZWNvLCBgTWFzcyBwZXJjZW50YCwgZmlsbCA9IEZyYWN0aW9uKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fY29sKCkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGVwdGgpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgMjAwMSB0b28gaGFyZCB0byBwbG90IHdpdGggYWxsIGRlcHRocwpzcmEuZnJjLm1zcy5maWxsLnBsb3QuZGYgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAwMSkgJT4lCiAgZ3JvdXBfYnkoUE1lY28sIEZyYWN0aW9uKSAlPiUKICBzdW1tYXJpemUoYE1hc3MgcGVyY2VudGAgPSBtZWFuKGBNYXNzIHBlcmNlbnRgKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhQTWVjbywgYE1hc3MgcGVyY2VudGAsIGZpbGwgPSBGcmFjdGlvbikpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyBtZXJnZSB3LyBmcmMgbGlzdHMKc3JhLmZyYy5zb2MuMjAwMS5scyA8LSBsYXBwbHkobGFwcGx5KHNyYS5mcmMuMjAwMS5scywgYmluZF9yb3dzKSwgZnVuY3Rpb24oZGYpIHsKICBtZXJnZShkZiwgCiAgICAgICAgc29jLjIwMDEuc3VtLmRmICU+JQogICAgICAgICAgbXV0YXRlKFBNID0gc3Vic3RyKFBNZWNvLCAxLCAyKSwKICAgICAgICAgICAgICAgICBFQ08gPSBzdWJzdHIoUE1lY28sIDMsIDQpKSAlPiUKICAgICAgICAgIHNlbGVjdChQTSwgRUNPLCBseXJfYm90LCBseXJfdG9wLCBjX3BjdF9tZWFuLCBseXJfc29jX2tnbTJfbWVhbikgJT4lCiAgICAgICAgICByZW5hbWUoY19wY3RfbHlyID0gY19wY3RfbWVhbiwKICAgICAgICAgICAgICAgICBseXJfc29jID0gbHlyX3NvY19rZ20yX21lYW4pLCAKICAgICAgICBieSA9IGMoIlBNIiwgIkVDTyIsICJseXJfYm90IiwgImx5cl90b3AiKSkgJT4lCiAgICBzZWxlY3QoLSJJRCIpICU+JQogICAgbXV0YXRlKHllYXIgPSAyMDAxKQp9KQpzcmEuZnJjLnNvYy4yMDE5LmxzIDwtIGxhcHBseShsYXBwbHkoc3JhLmZyYy4yMDE5LmxzLCBiaW5kX3Jvd3MpLCBmdW5jdGlvbihkZikgewogIG1lcmdlKGRmLCBzcmEuc29jLjIwMTkuZGYsIGJ5ID0gYygiUE0iLCAiRUNPIiwgImx5cl9ib3QiKSkgJT4lCiAgICBzZWxlY3QoLWMoIklEIikpCn0pCgojIG1lcmdlIDAxLCAxOQpzcmEuZnJjLnNvYy4wMS4xOS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS5mcmMuc29jLjIwMTkubHMpLCBmdW5jdGlvbihpKSB7CiAgcmJpbmQoc3JhLmZyYy5zb2MuMjAxOS5sc1tbaV1dLCBzcmEuZnJjLnNvYy4yMDAxLmxzW1tpXV0pCn0pCm5hbWVzKHNyYS5mcmMuc29jLjAxLjE5LmxzKSA8LSBuYW1lcyhzcmEuZnJjLnNvYy4yMDE5LmxzKQoKIyBtZXJnZSBtYXNzIGZyYwpzcmEuZnJjLm1zcy5maWxsLmxvbmcubHMgPC0gc3BsaXQoc3JhLmZyYy5tc3MuZmlsbC5wbG90LmRmLCBzcmEuZnJjLm1zcy5maWxsLnBsb3QuZGYkRnJhY3Rpb24pCnNyYS5mcmMubXNzLmZpbGwubG9uZy5scyA8LSBsYXBwbHkoc3JhLmZyYy5tc3MuZmlsbC5sb25nLmxzLCBmdW5jdGlvbihkZikgewogIGRmWyAsIGMoIlBNIiwgIkVDTyIsICJ5ZWFyIiwgImx5cl9ib3QiLCAiTWFzcyBwZXJjZW50IildCn0pCnNyYS5mcmMuc29jLmxzIDwtIG1hcHBseSgKICBtZXJnZSwKICBzcmEuZnJjLnNvYy4wMS4xOS5scywKICBzcmEuZnJjLm1zcy5maWxsLmxvbmcubHMsCiAgU0lNUExJRlkgPSBGQUxTRSkKCiMgQ2FsY3VsYXRlIEMgcGN0IG9mIGxheWVyLCBhYnNvbHV0ZSBDLCBzdG9jayBwZXIgZnJhY3Rpb24Kc3JhLmZyYy5zb2MuZGYgPC0gYmluZF9yb3dzKHNyYS5mcmMuc29jLmxzLCAuaWQgPSAiRnJhY3Rpb24iKQpzcmEuZnJjLnNvYy5kZiRmcmNfQ19seXIgPC0gKHNyYS5mcmMuc29jLmRmJEMgKiBzcmEuZnJjLnNvYy5kZiRgTWFzcyBwZXJjZW50YCkgLwogICAgc3JhLmZyYy5zb2MuZGYkY19wY3RfbHlyCnNyYS5mcmMuc29jLndpZGUuZGYgPC0gcGl2b3Rfd2lkZXIoCiAgc3JhLmZyYy5zb2MuZGYsIAogIGlkX2NvbHMgPSBjKCJ5ZWFyIiwgIlBNIiwgIkVDTyIsICJseXJfYm90IiwgImx5cl9zb2MiLCAiY19wY3RfbHlyIiwpLCAKICBuYW1lc19mcm9tID0gYygiRnJhY3Rpb24iKSwgdmFsdWVzX2Zyb20gPSBjKCJDIiwgIk1hc3MgcGVyY2VudCIsICJmcmNfQ19seXIiKSkgJT4lCiAgbWVyZ2UoLiwgc3JhLmZyYy5tc3Mud2lkZS5maWxsLmRmWyAsIGMoIlBNIiwgIkVDTyIsICJseXJfYm90IiwgInllYXIiLCAid3RfZyIpXSkKCiMgc3VtIGdDIGZyYwpzcmEuZnJjLnNvYy53aWRlLmRmJGNfcGN0X2x5cl9mcmMgPC0gcm93U3VtcyhzcmEuZnJjLnNvYy53aWRlLmRmWywgYygiZnJjX0NfbHlyX0ZQT00iLCAiZnJjX0NfbHlyX09QT00iLCAiZnJjX0NfbHlyX01PTSIpXSkgKiAxMDAKc3JhLmZyYy5zb2Mud2lkZS5kZiRDX2RpZmYgPC0gc3JhLmZyYy5zb2Mud2lkZS5kZiRjX3BjdF9seXJfZnJjIC0gMTAwCmBgYAoKYGBge3IgcGxvdC1jLWxvc3N9CiMgMjAwMQojIHNyYS5mcmMuc29jLndpZGUuZGYgJT4lCiMgICBmaWx0ZXIoeWVhciA9PSAyMDAxKSAlPiUKIyAgIG11dGF0ZShQTWVjbyA9IHBhc3RlMChQTSwgRUNPKSkgJT4lCiMgICBnZ3Bsb3QoLiwgYWVzKFBNZWNvLCBzb2NfbG9zdCkpICsKIyAgIGdlb21fY29sKCkgKwojICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhseXJfYm90KSkgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyAyMDE5CnNyYS5mcmMuc29jLndpZGUuZGYgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAxOSkgJT4lCiAgbXV0YXRlKFNpdGUgPSBmYWN0b3IocGFzdGUwKFBNLCBFQ08pLCAKICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJBTnBwIiwgIkFOd2YiLCAiQU5yZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTcHAiLCAiQlN3ZiIsICJCU3JmIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1JwcCIsICJHUndmIiwgIkdScmYiKSksCiAgICAgICAgIGBDIGRpZi4gKCUgb2YgdG90YWwgc3RvY2spYCA9IENfZGlmZikgJT4lCiAgZ2dwbG90KC4sIGFlcyhTaXRlLCBgQyBkaWYuICglIG9mIHRvdGFsIHN0b2NrKWApKSArCiAgZ2VvbV9jb2woKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhseXJfYm90KSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKIyMgRnJhY3Rpb24gMTRDCiMjIyBEZXB0aCBwcm9maWxlcwoKYGBge3Igc2hhcGUtZGVuczE0Qy1kZn0KIyBmdW5jdGlvbiBmb3Igc3BsaXR0aW5nIHNhbXBsZSBuYW1lcyBhbmQgZXh0cmFjdGluZyB2YWx1ZXMgZnJvbSBhbXMgbGlzdAp1U2NvcmVTcGxpdC5meCA8LSBmdW5jdGlvbihkZiwgaXgpIHNhcHBseShzdHJzcGxpdChkZltbIlByb2JlIl1dLCAiXyIpLCAiW1siLCBpeCkKCiMgY3JlYXRlIGRmCmRlbnMuZGYgPC0gYmluZF9yb3dzKAogIGxhcHBseSgKICAgIGFtc19yZXN1bHRzX2xzWy1ncmVwKCJ0aG1sIiwgbmFtZXMoYW1zX3Jlc3VsdHNfbHMpKV0sIGZ1bmN0aW9uKGxzKSB7CiAgICAgIGRmLmV4IDwtIGZ1bmN0aW9uKHgsIGZyYykgewogICAgICAgIGJpbmRfcm93cyhsYXBwbHkoeCwgZnVuY3Rpb24oZGYpIHsKICAgICAgICAgIGRmW2dyZXAoZnJjLCBkZiRQcm9iZSksIDI6Nl0KICAgICAgICB9KSkKICAgICAgfQogICAgICBmUE9NIDwtIGRmLmV4KGxzLCAiRlBPTSIpCiAgICAgIG9QT00gPC0gZGYuZXgobHMsICJPUE9NIikKICAgICAgbWluQyA8LSBkZi5leChscywgIk1PTSIpCiAgICAgIHJldHVybigKICAgICAgICBjYmluZChyYmluZChmUE9NLCBvUE9NLCBtaW5DKSwgZnJjID0gYyhyZXAoImZQT00iLCBucm93KGZQT00pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoIm9QT00iLCBucm93KG9QT00pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoIm1pbkMiLCBucm93KG1pbkMpKSkpKQogICAgfSkpICU+JQogIG11dGF0ZShQTWVjbyA9IHVTY29yZVNwbGl0LmZ4KC4sIDIpLAogICAgICAgICBQTSA9IHN1YnN0cihQTWVjbywgMSwgMiksCiAgICAgICAgIEVDTyA9IGZhY3RvcihzdWJzdHIoUE1lY28sIDMsIDQpLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSwKICAgICAgICAgWWVhciA9IHVTY29yZVNwbGl0LmZ4KC4sIDQpLAogICAgICAgICBwcm9fbmFtZSA9IHBhc3RlMChQTWVjbywgIl8iLCBZZWFyKSwKICAgICAgICAgZGVwdGhzID0gdVNjb3JlU3BsaXQuZngoLiwgNSksCiAgICAgICAgIGx5cl90b3AgPSBhcy5udW1lcmljKHNhcHBseShzdHJzcGxpdChkZXB0aHMsICItIiksICJbWyIsIDEpKSwKICAgICAgICAgbHlyX2JvdCA9IGFzLm51bWVyaWMoc2FwcGx5KHN0cnNwbGl0KGRlcHRocywgIi0iKSwgIltbIiwgMikpKSAlPiUKICByZW5hbWUoZnJjXzE0YyA9ICLiiIYxNEMuKOKAsCkiLAogICAgICAgICBmcmNfMTRjX2VyciA9ICJlcnIuKOKAsCkiKSAlPiUKICBzZWxlY3QoLWMoUHJvYmUsIGRlcHRocykpICU+JQogIGZpbHRlcighaXMubmEoZnJjXzE0YykpCgojIGFkZCAnMDkgZGF0YQpkZW5zLjAxLjA5LjE5LmRmIDwtIHJiaW5kKAogIGRlbnMuZGYsIAogIHNyYS5mcmMuMTRjICU+JQogICAgc2VsZWN0KC1seXJfYmRfc2FtcCkpICU+JQogIG11dGF0ZShwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLCAKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLCBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgeWVhciA9IGFzLm51bWVyaWMoWWVhciksCiAgICAgICAgIG1pZGRlcHRoID0gbHlyX3RvcCArIChseXJfYm90IC0gbHlyX3RvcCkgLyAyKQpgYGAKCmBgYCB7ciBwbG90LXByb2ZpbGVzfQojIHBybyBwbG90IGZ4CmRlbnMucHJvLnAuZnggPC0gZnVuY3Rpb24oZGYsIHllYXIsIGxlZy5wb3MgPSAicmlnaHQiKSB7CiAgCiAgIyBmaWx0ZXIgZGYgYnkgeWVhcgogIGRmIDwtIGRmW2RmJHllYXIgPT0geWVhciwgXQogIAogICMgZ2V0IGF0bSAxNEMKICBhdG0uMTRjIDwtIGF0bS4xNGNbYXRtLjE0YyR5ZWFyID09IHllYXIgKyAuNSwgImQxNGMiXQogIAogICMgc2V0IHNoYXBlIHRvIDIwMDEgZGVmYXVsdHMKICBzaHAudiA8LSBjKCJ3YXJtIiA9IDE1LCAiY29vbCIgPSAxNywgImNvbGQiID0gMTYpCiAgYWxmIDwtIDEKICBsbnQudiA8LSBjKCIyMDAxIiA9IDEpCiAgc3Ryb2tlIDwtIDEKICBsbi5zeiA8LSAuNQogIAogICMgY2hhbmdlIHNoYXBlIGFuZCBhbHBoYSBhcyBuZWVkZWQKICBpZiAoeWVhciA9PSAyMDA5KSB7CiAgICBhbGYgPC0gLjYKICAgIGxudC52IDwtIGMoIjIwMDkiID0gMikKICB9IGVsc2UgaWYgKHllYXIgPT0gMjAxOSkgewogICAgc2hwLnYgPC0gYygid2FybSIgPSAwLCAiY29vbCIgPSAyLCAiY29sZCIgPSAxKQogICAgbG50LnYgPC0gYygiMjAxOSIgPSAzKQogICAgc3Ryb2tlIDwtIDEuMgogICAgbG4uc3ogPC0gMQogIH0KICAKICAjIHBsb3QgZngKICBnZ3Bsb3QoZGYsIGFlcyhmcmNfMTRjLCBseXJfYm90LCBjb2xvciA9IGZyYykpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS4xNGMsIGNvbG9yID0gImdyYXkiKSArCiAgICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGVjbyksIHNpemUgPSAzLCBhbHBoYSA9IGFsZiwgc3Ryb2tlID0gc3Ryb2tlKSArCiAgICBnZW9tX3BhdGgoYWVzKGxpbmV0eXBlID0gWWVhciksIHNpemUgPSBsbi5zeikgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIm1pbkMiID0gIiM5YjAwM2YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZQT00iID0gIiMzZjliMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9QT00iID0gIiMwMDQ3YWYiKSkgKwogICAgc2NhbGVfbGluZXR5cGVfbWFudWFsKG5hbWUgPSBOVUxMLCB2YWx1ZXMgPSBsbnQudikgKwogICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSBOVUxMLCB2YWx1ZXMgPSBzaHAudikgKwogICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICAgIHNjYWxlX3lfcmV2ZXJzZSgpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGxlZy5wb3MpCn0KCiMgcHJvIHBsb3QgZngKZGVucy5wcm8ucC5meDIgPC0gZnVuY3Rpb24oZGYpIHsKICAKICBnZ3Bsb3QoZGYsIGFlcyhmcmNfMTRjLCBtaWRkZXB0aCwgY29sb3IgPSBwbSkpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gMikgKwogICAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBlY28pLCBzaXplID0gMykgKwogICAgZ2VvbV9wYXRoKCkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSBOVUxMLCAKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNikpICsKICAgIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMoZnJjMikpICsKICAgIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKDMwLCAwKSkgKwogICAgdGhlbWVfYncoKSArCiAgICB5bGFiKCJEZXB0aCAoY20pIikgKwogICAgeGxhYihleHByZXNzaW9uKCdGcmFjdGlvbiAnKkRlbHRhKicnXjE0KicgKOKAsCknKSkgKwogICAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5jb2wgPSAzKSwKICAgICAgICAgICBzaGFwZSA9IGd1aWRlX2xlZ2VuZChuY29sID0gMykpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMiksCiAgICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgYW5nbGUgPSAwLCBzaXplID0gMTIpLAogICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSAid2hpdGUiKSwKICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgCn0KYGBgCgpgYGB7ciBwbG90LWRlbnMtcHJvc30KIyBwbG90IHByb2ZpbGVzIGJ5IHllYXIgYW5kIGZyYWN0aW9uIHR5cGUKZGVucy5wcm8ucC5meChkZW5zLjAxLjA5LjE5LmRmLCAyMDAxKQpkZW5zLnByby5wLmZ4KGRlbnMuMDEuMDkuMTkuZGYsIDIwMTkpCmRlbnMucHJvLnAuZngoZGVucy4wMS4wOS4xOS5kZiwgMjAwOSkKICAgICAgCmRlbnMuMDEuMDkuMTkucGxvdC5kZiA8LSBkZW5zLjAxLjA5LjE5LmRmICU+JQogIGZpbHRlcihseXJfYm90IDwgMzEpICU+JQogIG11dGF0ZShmcmMyID0gaWZlbHNlKGZyYyA9PSAiZlBPTSIsICJmcmVlIGxpZ2h0IiwgaWZlbHNlKGZyYyA9PSAib1BPTSIsICJvY2NsdWRlZCBsaWdodCIsICJoZWF2eSIpKSkKZGVucy4wMS4wOS4xOS5wbG90LmRmIDwtIGRlbnMuMDEuMDkuMTkucGxvdC5kZltkZW5zLjAxLjA5LjE5LnBsb3QuZGYkZnJjICE9ICJvUE9NIiAmIGRlbnMuMDEuMDkuMTkucGxvdC5kZiR5ZWFyID09IDIwMTksIF0KCmRlbnMucHJvLnAuZngyKGRlbnMuMDEuMDkuMTkucGxvdC5kZikKYGBgCgojIyBTcGxpbmUgJzAxLCAnMDkKIyMjIFNwbGluZSBDCgpgYGB7ciBzcGxpbmUtYy1kYXRhfQojIHNwbGluZSBmaXQgZnhzIGZvciBmcmFjdGlvbiBTT0Mgc3RvY2tzCiMjIE1hc3MgcHJlc2VydmluZyBzcGxpbmUgKHF1YWRyYXRpYykKbXBzcGxpbmUuZnJjLmZ4IDwtIGZ1bmN0aW9uKGZyYy5kZikgewogIAogICMgc3BsaXQgYnkgZnJjIGFuZCBQTWVjbyB0byBmaXQgc3BsaW5lcyB0byBwcm9maWxlcwogIGxhcHBseSgKICAgIHNwbGl0KGZyYy5kZiwgZnJjLmRmJGZyYyksIGZ1bmN0aW9uKGRmKSB7CiAgICAgIGxhcHBseShzcGxpdChkZiwgZGYkUE1lY28pLCBmdW5jdGlvbih4KSB7CiAgICAgICAgCiAgICAgICAgIyBjaGVjayBmb3Igc2luZ2xlIG9icyBkYXRhCiAgICAgICAgaWYgKG5yb3coeCkgPiAxKSB7CiAgICAgICAgICAKICAgICAgICAgICMgbWFrZSBzdXJlIHRvIG9yZGVyIGRhdGEKICAgICAgICAgIHggPC0geFtvcmRlcih4JGx5cl9ib3QpLCBdIAogICAgICAgICAgCiAgICAgICAgICAjIGNhbGN1bGF0ZSBjdW11bGF0aXZlIEMgbWFzcwogICAgICAgICAgeCRtYXNzX2NfY210diA8LSBOQQogICAgICAgICAgZm9yKGkgaW4gc2VxX2Fsb25nKHgkbHlyX2JvdCkpIHsKICAgICAgICAgICAgaWYoaSA9PSAxKSB7CiAgICAgICAgICAgICAgeCRtYXNzX2NfY210dltpXSA8LSB4JG1hc3NfY19nW2ldCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgeCRtYXNzX2NfY210dltpXSA8LSB4JG1hc3NfY19nW2ldICsgeCRtYXNzX2NfY210dltpLTFdIAogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgICMgY29udmVydCB0byBzb2lsIHByb2ZpbGUgY29sbGVjdGlvbiBvYmogYW5kIHJ1biBtcHNwbGluZQogICAgICAgICAgZGVwdGhzKHgpIDwtIFBNZWNvIH4gbHlyX3RvcCArIGx5cl9ib3QKICAgICAgICAgIHgubXBzIDwtIHN1cHByZXNzTWVzc2FnZXMoCiAgICAgICAgICAgIG1wc3BsaW5lKHgsIHZhci5uYW1lID0gIm1hc3NfY19jbXR2Iiwgc2hvdy5wcm9ncmVzcyA9IEZBTFNFKSkKICAgICAgICAgIAogICAgICAgICAgIyBleHRyYWN0IDEgY20gaW5jcmVtZW50IGRhdGEKICAgICAgICAgIGl4IDwtIHdoaWNoKCFpcy5uYSh4Lm1wcyR2YXIuMWNtKSkKICAgICAgICAgIGRmIDwtIGRhdGEuZnJhbWUobWlkZGVwdGggPSBzZXEoMSwgbGVuZ3RoKGl4KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGx5cl9zb2MgPSB4Lm1wcyR2YXIuMWNtW2l4XSkKICAgICAgICAgIAogICAgICAgICAgIyBjaGVjayBmb3IgTkEgdmFsdWVzIHVwIHRvIDMwIGNtCiAgICAgICAgICBpZiAobGVuZ3RoKGl4KSA8IDMxKSB7CiAgICAgICAgICAgICMgY29udmVydCB0byBjbGFzcyAic3BsaW5lIiB3aXRoIHNtb290aC5zcGxpbmUgZnhuCiAgICAgICAgICAgIHNwLnNzIDwtIHNtb290aC5zcGxpbmUoZGYpCiAgICAgICAgICAKICAgICAgICAgICAgIyBwcmVkaWN0IGZvciBOQSB2YWx1ZXMgdXAgdG8gMzEgY20gKGxpbmVhciBiZXlvbmQgbGFzdCBtZWFzdXJlZCBkZXB0aCkKICAgICAgICAgICAgc3RkIDwtIHNlcSgwLCAzMCkgIyBpbiBjbSAKICAgICAgICAgICAgc3AgPC0gcHJlZGljdChzcC5zcywgc3RkKSAKICAgICAgICAgICAgZGYgPC0gZGF0YS5mcmFtZShzcCkKICAgICAgICAgICAgY29sbmFtZXMoZGYpIDwtIGMoIm1pZGRlcHRoIiwibHlyX3NvYyIpIAogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICAjIHJldHVybgogICAgICAgICAgcmV0dXJuKGRmKQogICAgICAgIH0KICAgICAgfSkKICAgIH0pCn0KCiMjIGRlcHRoIHNwbGluZSBhbHRlcm5hdGl2ZSAobGluZWFyIGZvciB0d28gaW5jcmVtZW50IGZpdHMuLi4pClNPQ3NwbGluZS5meCA8LSBmdW5jdGlvbihmcmMuZGYpIHsKICAKICAjIHNwbGl0IGJ5IGZyYyBhbmQgUE1lY28gdG8gZml0IHNwbGluZXMgdG8gcHJvZmlsZXMKICBsYXBwbHkoCiAgICBzcGxpdChmcmMuZGYsIGZyYy5kZiRmcmMpLCBmdW5jdGlvbihkZikgewogICAgICBsYXBwbHkoc3BsaXQoZGYsIGRmJFBNZWNvKSwgZnVuY3Rpb24oeCkgewogICAgCiAgICAgICAgIyBjaGVjayBmb3Igc2luZ2xlIG9icyBkYXRhCiAgICAgICAgaWYgKG5yb3coeCkgPiAxKSB7CiAgICAgICAgICAKICAgICAgICAgICMgbWFrZSBzdXJlIHRvIG9yZGVyIGRhdGEKICAgICAgICAgIHggPC0geFtvcmRlcih4JGx5cl9ib3QpLCBdIAogICAgICAgICAgCiAgICAgICAgICAjIGNhbGN1bGF0ZSBjdW11bGF0aXZlIEMgbWFzcwogICAgICAgICAgeCRtYXNzX2NfY210diA8LSBOQQogICAgICAgICAgZm9yKGkgaW4gc2VxX2Fsb25nKHgkbHlyX2JvdCkpIHsKICAgICAgICAgICAgaWYoaSA9PSAxKSB7CiAgICAgICAgICAgICAgeCRtYXNzX2NfY210dltpXSA8LSB4JG1hc3NfY19nW2ldCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgeCRtYXNzX2NfY210dltpXSA8LSB4JG1hc3NfY19nW2ldICsgeCRtYXNzX2NfY210dltpLTFdIAogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgICMgZml0IG1vbm90b25pYyBjdWJpYyBzcGxpbmUKICAgICAgICAgIHNwIDwtIHNwbGluZSh4WyAsIGMoIm1pZGRlcHRoIiwgIm1hc3NfY19jbXR2IildLCBtZXRob2QgPSAiaHltYW4iKSAKICAgICAgICAgIAogICAgICAgICAgIyBjb252ZXJ0IHRvIGNsYXNzICJzcGxpbmUiIHdpdGggc21vb3RoLnNwbGluZSBmeG4KICAgICAgICAgIHNwLnNzIDwtIHNtb290aC5zcGxpbmUoc3ApIAogICAgICAgICAgCiAgICAgICAgICAjIHByZWRpY3QgMSBjbSBpbmNyZW1lbnRzIHRvIDMwIGNtIChsaW5lYXIgYmV5b25kIGxhc3QgbWVhc3VyZWQgZGVwdGgpCiAgICAgICAgICBzdGQgPC0gc2VxKDAsIDMwKSAjIGluIGNtIAogICAgICAgICAgc3AgPC0gcHJlZGljdChzcC5zcywgc3RkKSAKICAgICAgICAgIGRmIDwtIGRhdGEuZnJhbWUoc3ApCiAgICAgICAgICBjb2xuYW1lcyhkZikgPC0gYygibWlkZGVwdGgiLCJseXJfc29jIikgCiAgICAgICAgICAKICAgICAgICAgICMgcmV0dXJuIAogICAgICAgICAgcmV0dXJuKGRmKQogICAgICAgIH0KICAgICAgfSkKICAgIH0pCn0KYGBgCgpgYGB7ciBydW4tY3NwbGluZS1mcmN9CiMgZnJhY3Rpb24gQyBzdG9ja3MKc29jLjIwMDkuZnJjU09DLnNwIDwtIG1wc3BsaW5lLmZyYy5meChzcmEuMDkubHlyLkMpCnNvYy4yMDAxLmZyY1NPQy5zcCA8LSBtcHNwbGluZS5mcmMuZngoc3JhLmZyYy5tc3MuQy4wMS5kZikKc29jLjIwMDEuZnJjU09DLnNwLmRmIDwtIGxhcHBseShzb2MuMjAwMS5mcmNTT0Muc3AsIGZ1bmN0aW9uKGxzKQogIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICAgICMgc3VtbWFyaXplIGZvciB0YXJnZXQgaW50ZXJ2YWxzCiAgICAgICAgZGYgPC0gZGF0YS5mcmFtZSgKICAgICAgICAgIGx5cl9ib3QgPSBjKDEwLCAyMCwgMzApLAogICAgICAgICAgbHlyX3NvY19jbXR2ID0gYyhkZlsxMCwgImx5cl9zb2MiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZbMjAsICJseXJfc29jIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmWzMwLCAibHlyX3NvYyJdKSkKICAgICAgICBkZiRseXJfc29jIDwtIE5BCiAgICAgICAgZm9yIChpIGluIHNlcV9hbG9uZyhkZiRseXJfYm90KSkgewogICAgICAgICAgaWYoaSA9PSAxKSB7CiAgICAgICAgICAgICAgZGYkbHlyX3NvY1tpXSA8LSBkZiRseXJfc29jX2NtdHZbaV0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBkZiRseXJfc29jW2ldIDwtIGRmJGx5cl9zb2NfY210dltpXSAtIGRmJGx5cl9zb2NfY210dltpIC0gMV0gCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuKGRmWyAsIGMoImx5cl9ib3QiLCAibHlyX3NvYyIpXSkKICB9KSkKCnRlc3QgPC0gc3JhLmZyYy5tc3MuQy4wMS5kZiAlPiUgCiAgU09Dc3BsaW5lLmZ4CgojIE1lYXN1cmVkIFNPQyBhcyBscwpzcmEuZnJjLm1zcy5DLjAxLmxzIDwtIGxhcHBseSgKICBzcGxpdChzcmEuZnJjLm1zcy5DLjAxLmRmLCBzcmEuZnJjLm1zcy5DLjAxLmRmJGZyYyksIGZ1bmN0aW9uKGRmKQogICAgc3BsaXQoZGYsIGRmJFBNZWNvKSkKCiMgbWFrZSBzcGxpbmUgbGlzdHMgc2ltaWxhciBmb3IgcGxvdHRpbmcgdG9nZXRoZXIKZnJjLnBtZWNvLmZ4IDwtIGZ1bmN0aW9uKHNvY19scywgbmFtZSkgewogICAgbGFwcGx5KHNlcV9hbG9uZyhzb2NfbHMpLCBmdW5jdGlvbihqKQogICAgICBsYXBwbHkoc2VxX2Fsb25nKHNvY19sc1tbal1dKSwgZnVuY3Rpb24oaSkgewogICAgICAgIFBNZWNvIDwtIG5hbWVzKHNvY19sc1tbal1dKVtpXQogICAgICAgIGlmICghaXMuZGF0YS5mcmFtZShzb2NfbHNbW2pdXVtbaV1dKSkgewogICAgICAgICAgbHlyX3NvYyA8LSBzb2NfbHNbW2pdXVtbaV1dCiAgICAgICAgICBkZiA8LSBkYXRhLmZyYW1lKG1pZGRlcHRoID0gc2VxKDEsIGxlbmd0aChseXJfc29jKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGx5cl9zb2MgPSBseXJfc29jKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkZiA8LSBzb2NfbHNbW2pdXVtbaV1dCiAgICAgICAgfQogICAgICAgICMgYWRkIG5hbWUgYW5kIHJldHVybgogICAgICAgIGRmICU+JQogICAgICAgICAgbXV0YXRlKGlkID0gbmFtZSwKICAgICAgICAgICAgICAgICBQTWVjbyA9IFBNZWNvLAogICAgICAgICAgICAgICAgIGZyYyA9IG5hbWVzKHNvY19scylbal0pCiAgICAgIH0pKQogIH0KICAKIyBydW4gZngKbHMxIDwtIGZyYy5wbWVjby5meCh0ZXN0LCAic3AiKQpsczIgPC0gZnJjLnBtZWNvLmZ4KHNvYy4yMDAxLmZyY1NPQy5zcCwgIm1wc3BsaW5lIikKICAKIyBjb21iaW5lIGxpc3RzCmxzMTIgPC0gbGFwcGx5KHNlcV9hbG9uZyhsczEpLCBmdW5jdGlvbihpKQogIGJpbmRfcm93cygKICAgIGxhcHBseShzZXFfYWxvbmcobHMxW1tpXV0pLCBmdW5jdGlvbihqKQogICAgICByYmluZChsczFbW2ldXVtbal1dLCBsczJbW2ldXVtbal1dKQogICAgICApLCAuaWQgPSAiUE1lY28iKSAlPiUKICAgIG11dGF0ZShQTWVjbyA9IGZhY3RvcihQTWVjbywgbGFiZWxzID0gdW5pcXVlKHNyYS5mcmMubXNzLkMuMDEuZGYkUE1lY28pKSkpCgojIGNhbGN1bGF0ZSBjdW11bGF0aXZlIEMgbWFzcwpzcmEuZnJjLm1zcy5DLjAxLmxzMiA8LSBsYXBwbHkoc3JhLmZyYy5tc3MuQy4wMS5scywgZnVuY3Rpb24obHMpIHsKICBsYXBwbHkobHMsIGZ1bmN0aW9uKGRmKSB7CiAgICBkZiRtYXNzX2NfY210diA8LSBOQQogICAgZm9yKGkgaW4gc2VxX2Fsb25nKGRmJGx5cl9ib3QpKSB7CiAgICAgIGlmKGkgPT0gMSkgewogICAgICAgIGRmJG1hc3NfY19jbXR2W2ldIDwtIGRmJG1hc3NfY19nW2ldCiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGYkbWFzc19jX2NtdHZbaV0gPC0gZGYkbWFzc19jX2dbaV0gKyBkZiRtYXNzX2NfY210dltpIC0gMV0gCiAgICAgIH0KICAgIH0KICAgIHJldHVybihkZikKICB9KQp9KQoKIyBhZGQgYWRkaXRpb25hbCAwIG1lYXN1cmVtZW50IGZvciBzdGVwIHBsb3QKc3JhLmZyYy5tc3MuQy4wMS5sczMgPC0gbGFwcGx5KHNyYS5mcmMubXNzLkMuMDEubHMyLCBmdW5jdGlvbihscykKICBiaW5kX3Jvd3MobGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgeCA8LSBkZlt3aGljaChkZiRseXJfYm90ID09IG1pbihkZiRseXJfYm90KSksIF0KICAgIHgkbHlyX2JvdCA8LSAwCiAgICByYmluZCh4LCBkZikKICB9KSkKKQoKIyBiaW5kIHJvd3Mgb2Ygc3VibGlzdApzcmEuZnJjLm1zcy5DLjAxLmxzNCA8LSBsYXBwbHkoc3JhLmZyYy5tc3MuQy4wMS5sczIsIGZ1bmN0aW9uKGxzKSBiaW5kX3Jvd3MobHMpKQoKIyBhZGQgbWVhc3VyZWQgZGF0YSB0byBkZjEyIGFuZCBwbG90CnAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhsczEyKSwgZnVuY3Rpb24oaSkgewogIGZyYyA8LSBsczEyW1tpXV1bWyJmcmMiXV0KICBsczEyW1tpXV0gJT4lCiAgICBtdXRhdGUoUE0gPSBzdWJzdHIoUE1lY28sIDEsIDIpLAogICAgICAgICAgIEVDTyA9IHN1YnN0cihQTWVjbywgMywgNCkpICU+JQogICAgZ2dwbG90KC4sIGFlcyhseXJfc29jLCBtaWRkZXB0aCwgY29sb3IgPSBQTSkpICsKICAgIGdlb21fc3RlcChkYXRhID0gc3JhLmZyYy5tc3MuQy4wMS5sczNbW2ldXSwKICAgICAgICAgICAgICBhZXMobWFzc19jX2NtdHYsIGx5cl9ib3QpKSArCiAgICBnZW9tX3BhdGgoYWVzKGxpbmV0eXBlID0gaWQpKSArCiAgICBnZW9tX3BvaW50KGRhdGEgPSBzcmEuZnJjLm1zcy5DLjAxLmxzNFtbaV1dLAogICAgICAgICAgICAgICBhZXMobWFzc19jX2NtdHYsIG1pZGRlcHRoKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkFOIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSBncmFuaXRlKSkgKyAgICAgIAogICAgc2NhbGVfeV9yZXZlcnNlKCkgKwogICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhQTSksIHJvd3MgPSB2YXJzKEVDTykpICsKICAgIGdndGl0bGUoZnJjKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCn0pCgojIHBsb3QKcC5scwpgYGAKCmBgYHtyIGNvbWJpbmUtZnBvbS1vcG9tfQojIGNvbWJpbmUgZlBPTSBhbmQgb1BPTSBmb3IgIlBPTSIgZnJhY3Rpb24Kc29jLjIwMDEuUE9NLnNwLmRmIDwtIGJpbmRfcm93cyhtYXBwbHkoCiAgbWVyZ2UsCiAgc29jLjIwMDEuZnJjU09DLnNwLmRmJEZQT00sCiAgc29jLjIwMDEuZnJjU09DLnNwLmRmJE9QT00sCiAgTW9yZUFyZ3MgPSBsaXN0KGJ5ID0gImx5cl9ib3QiLCBzdWZmaXhlcyA9IGMoIl9mUE9NIiwgIl9vUE9NIikpLAogIFNJTVBMSUZZID0gRkFMU0UpLCAuaWQgPSAiUE1lY28iKQpzb2MuMjAwMS5QT00uc3AuZGYkc29jX1BPTSA8LSByb3dTdW1zKAogIHNvYy4yMDAxLlBPTS5zcC5kZlsgLCBjKCJseXJfc29jX2ZQT00iLCAibHlyX3NvY19vUE9NIildKQpwb20uYy4wMS5kZiA8LSBwaXZvdF9sb25nZXIoCiAgc29jLjIwMDEuUE9NLnNwLmRmLCAKICBjb2xzID0gc3RhcnRzX3dpdGgoImx5cl9zb2MiKSwKICBuYW1lc190byA9ICJmcmMiLAogIG5hbWVzX3ByZWZpeCA9ICJseXJfc29jXyIsCiAgdmFsdWVzX3RvID0gInNvY19mcmMiKQpwb20uYy4wMS5kZiRjX1BPTV9mcmMgPC0gcG9tLmMuMDEuZGYkc29jX2ZyYyAvIHBvbS5jLjAxLmRmJHNvY19QT00KYGBgCgojIyMgU3BsaW5lIDE0QwoKYGBge3Igc3BsaW5lLTE0Qy1mcmN9CiMgcnVuIG1wc3BsaW5lIG9uIGZyYWN0aW9uIG1vZGVybiBkYXRhIGZvciAnMDEsICcwOQpkZW5zLjAxLjA5LmRmIDwtIGRlbnMuMDEuMDkuMTkuZGZbd2hpY2goZGVucy4wMS4wOS4xOS5kZiR5ZWFyICE9IDIwMTkpLCBdCmRlbnMuMDEuMDkuZGYkZnJjIDwtIGZhY3RvcihkZW5zLjAxLjA5LmRmJGZyYywgbGV2ZWxzID0gYygiZlBPTSIsICJvUE9NIiwgIm1pbkMiKSkKZGVucy4wMS4wOS5scy5zcCA8LSBsYXBwbHkoCiAgc3BsaXQoZGVucy4wMS4wOS5kZiwgZGVucy4wMS4wOS5kZiRmcmMpLCBmdW5jdGlvbihkZikgewogICAgbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKGxlbmd0aCh3aGljaCghaXMubmEoeCRGMTRDKSkpID4gMSkgewogICAgICAgZGVwdGhzKHgpIDwtIHByb19uYW1lIH4gbHlyX3RvcCArIGx5cl9ib3QKICAgICAgICB4Lm1wcyA8LSBzdXBwcmVzc01lc3NhZ2VzKAogICAgICAgICAgbXBzcGxpbmUoeCwgdmFyLm5hbWUgPSAiRjE0QyIsIHNob3cucHJvZ3Jlc3MgPSBGQUxTRSkpCiAgICAgICAgeC5tcHMkdmFyLjFjbSA8LSB4Lm1wcyR2YXIuMWNtWzE6MzBdCiAgICAgICAgCiAgICAgICAgIyBmaWxsIE5BIHcvIHNtb290aC5zcGxpbmUgcHJlZGljdGlvbiAobGluZWFyKQogICAgICAgIGl4IDwtIHdoaWNoKGlzLm5hKHgubXBzJHZhci4xY20pKQogICAgICAgIGlmIChsZW5ndGgoaXgpID4gMCkgewogICAgICAgICAgc3Auc3MgPC0gc21vb3RoLnNwbGluZSh4Lm1wcyR2YXIuMWNtWy1peF0pCiAgICAgICAgICBzcCA8LSBwcmVkaWN0KHNwLnNzLCBpeCkKICAgICAgICAgIHgubXBzJHZhci4xY21baXhdIDwtIHNwJHkKICAgICAgICB9CiAgICAgICAgcmV0dXJuKHgubXBzKSAKICAgICAgfQogICAgfSkKICB9KQpkZW5zLjAxLjA5LmxzLnNwIDwtIGxhcHBseShkZW5zLjAxLjA5LmxzLnNwLCBmdW5jdGlvbihscykgewogIG5hbWVzKGxzKSA8LSBpZmVsc2UoZ3JlcGwoIjIwMTAiLCBuYW1lcyhscykpLCBzdWIoIjIwMTAiLCAiMjAwOSIsIG5hbWVzKGxzKSksIG5hbWVzKGxzKSkKICByZXR1cm4obHMpCn0pCmBgYAoKYGBge3IgcGxvdC1mcmMtZm0tc3BsaW5lc30KIyBwbG90IGZvciBkZXRlcm1pbmluZyBiZXN0IGV4dHJhcG9sYXRpb24gZngKZnJjLmZtLnNwLnBsb3QuZnggPC0gZnVuY3Rpb24oZm0uc3AubHMpIHsKICBsYXBwbHkoZm0uc3AubHMsIGZ1bmN0aW9uKGxzKSB7CiAgICBwIDwtIGJpbmRfcm93cyhsYXBwbHkoc2VxX2Fsb25nKGxzKSwgZnVuY3Rpb24oaSkgewogICAgICBpZiAoIWlzLm51bGwobHNbW2ldXSkpIHsKICAgICAgICBkZiA8LSBkYXRhLmZyYW1lKHQoZG8uY2FsbChyYmluZCwgbGlzdChsc1tbaV1dW1sxXV0sIGxzW1tpXV1bWzRdXSkpKSkKICAgICAgICBkZiRtaWRkZXB0aCA8LSBzZXEoMSwgbGVuZ3RoKGRmWyAsIDFdKSkKICAgICAgICBkZiRQTSA8LSBzdWJzdHIoZGZbICwgMV0sIDEsIDIpCiAgICAgICAgZGYkRUNPIDwtIHN1YnN0cihkZlsgLCAxXSwgMywgNCkKICAgICAgICBkZiRZZWFyIDwtIGlmZWxzZShzdWJzdHIoZGZbICwgMV0sIDYsIDkpID09ICIyMDEwIiwgIjIwMDkiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0cihkZlsgLCAxXSwgNiwgOSkpCiAgICAgICAgY29sbmFtZXMoZGYpWzJdIDwtICJmbSIKICAgICAgICBkZiRmbSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZiRmbSkpCiAgICAgICAgcmV0dXJuKGRmWyAsIC0xXSkKICAgICAgfQogICAgfSkpICU+JQogICAgZ2dwbG90KC4sIGFlcyhmbSwgbWlkZGVwdGgsIGNvbG9yID0gUE0sIGxpbmV0eXBlID0gWWVhcikpICsKICAgIGdlb21fcGF0aCgpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gZ3Jhbml0ZSkpICsKICAgIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIyMDAxIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAyKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLjc1LCAxLjI1KSkgKwogICAgc2NhbGVfeV9yZXZlcnNlKCkgKwogICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhFQ08pLCBjb2xzID0gdmFycyhQTSkpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKICB9KQp9CmRlbnMuMDEuMDkubHMuc3AucCA8LSBmcmMuZm0uc3AucGxvdC5meChkZW5zLjAxLjA5LmxzLnNwKQpgYGAKCiMjIyBDLXdlaWdodGVkIDE0QyBzcGxpbmUKCmBgYHtyIGN3dC0xNGN9CiMgZnJhY3Rpb25zCmN3dC5mcmMuZnggPC0gZnVuY3Rpb24oc29jLmxzKSB7CiAgbGFwcGx5KHNvYy5scywgZnVuY3Rpb24ocHJvX2xzKSB7CiAgICBsYXBwbHkocHJvX2xzLCBmdW5jdGlvbihzb2MpIHsKICAgICAgZCA8LSBzZXEoMTAsIDMwLCAxMCkKICAgICAgYyA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGQpKQogICAgICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgICAgICBpZihqID09IDEpIHsKICAgICAgICAgICMgZmlyc3QgZGVwdGggaW5jcmVtZW50CiAgICAgICAgICBjW1tqXV0gPC0gc29jWzE6ZFtqXSwgImx5cl9zb2MiXQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAjIGZvbGxvd2luZyBkZXB0aCBpbmNyZW1lbnRzCiAgICAgICAgICBjW1tqXV0gPC0gc29jWyhkW2otMV0rMSk6ZFtqXSwgImx5cl9zb2MiXSAKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuKHVubGlzdChsYXBwbHkoYywgZnVuY3Rpb24oeCkgeCAvIHN1bSh4LCBuYS5ybSA9IFRSVUUpKSkpCiAgICB9KQogIH0pCn0KCiMgMjAwMQpjd3QuMTkuMDEuZnJjIDwtIGN3dC5mcmMuZngoc29jLjIwMDEuZnJjU09DLnNwKQoKIyAyMDA5CmN3dC4xOS4wOS5mcmMgPC0gY3d0LmZyYy5meChzb2MuMjAwOS5mcmNTT0Muc3ApCgojIGNvbWJpbmUKY3d0LjE5LjAxLjA5LmZyYyA8LSBsYXBwbHkoc2VxX2Fsb25nKGN3dC4xOS4wMS5mcmMpLCBmdW5jdGlvbihpKSB7CiAgbHMuMDEgPC0gY3d0LjE5LjAxLmZyY1tbaV1dCiAgbmFtZXMobHMuMDEpIDwtIHBhc3RlMChuYW1lcyhjd3QuMTkuMDEuZnJjW1tpXV0pLCAiXzIwMDEiKQogIGxzLjA5IDwtIGN3dC4xOS4wOS5mcmNbW2ldXQogIG5hbWVzKGxzLjA5KSA8LSBwYXN0ZTAobmFtZXMoY3d0LjE5LjA5LmZyY1tbaV1dKSwgIl8yMDA5IikKICBscyA8LSBjKGxzLjAxLCBscy4wOSkKICBsc1tvcmRlcihuYW1lcyhscykpXQp9KQpuYW1lcyhjd3QuMTkuMDEuMDkuZnJjKSA8LSBuYW1lcyhjd3QuMTkuMDEuZnJjKQoKIyMgY2FsY3VsYXRlIGZtX3d0cwojIyAnMTkgZGVwdGhzCmZtLnd0ZC4xOS4wMS4wOSA8LSBsYXBwbHkoc2VxX2Fsb25nKGRlbnMuMDEuMDkubHMuc3ApLCBmdW5jdGlvbihpKSB7CiAgCiAgIyBydW4gZnggb24gbm9uLW51bGwgZWxlbWVudHMKICBmbS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGRlbnMuMDEuMDkubHMuc3BbW2ldXSksIGZ1bmN0aW9uKGopIHsKICAgIAogICAgaWYgKCFpcy5udWxsKGRlbnMuMDEuMDkubHMuc3BbW2ldXVtbal1dKSkgewogICAgICAKICAgICAgIyBjb21iaW5lIGN3dCwgZm0KICAgICAgZGYgPC0gZGF0YS5mcmFtZShjd3QgPSBjd3QuMTkuMDEuMDkuZnJjW1tpXV1bW2pdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBkZW5zLjAxLjA5LmxzLnNwW1tpXV1bW2pdXVtbInZhci4xY20iXV0pCiAgICAgICAgICAgIAogICAgICAjIGNhbGN1bGF0ZSB3dGQgZm0KICAgICAgZGYkZm1fd3QgPC0gZGYkY3d0ICogZGYkZm0KICAgICAgCiAgICAgICMgc3VtbWFyaXplIGZvciB0YXJnZXQgaW50ZXJ2YWxzCiAgICAgIGRhdGEuZnJhbWUoCiAgICAgICAgbHlyX2JvdCA9IGMoMTAsIDIwLCAzMCksCiAgICAgICAgZm0gPSBjKAogICAgICAgICAgc3VtKGRmWzE6MTAsICJmbV93dCJdKSwgCiAgICAgICAgICBzdW0oZGZbMTE6MjAsICJmbV93dCJdKSwgCiAgICAgICAgICBzdW0oZGZbMjE6MzAsICJmbV93dCJdKSkpIAogICAgfQogIH0pCiAgCiAgIyByZXN0b3JlIG5hbWVzCiAgbmFtZXMoZm0ubHMpIDwtIG5hbWVzKGRlbnMuMDEuMDkubHMuc3BbW2ldXSkKICAgIAogICMgcmV0dXJuIHd0ZCBmbSBsaXN0CiAgcmV0dXJuKGZtLmxzKQp9KQpuYW1lcyhmbS53dGQuMTkuMDEuMDkpIDwtIG5hbWVzKGRlbnMuMDEuMDkubHMuc3ApCmBgYAoKYGBge3IgcHJlcC1jd3QtMTRjLXBsb3R9CiMgbWFrZSBkZiBmb3Igc3BsaW5lZCAnMDEgZGF0YQpkZW5zLjAxLjA5LmRmIDwtIGJpbmRfcm93cygKICBsYXBwbHkoZm0ud3RkLjE5LjAxLjA5LCBmdW5jdGlvbihscykgCiAgICBiaW5kX3Jvd3MobHMsIC5pZCA9ICJQTWVjb195ZWFyIikpLCAuaWQgPSAiZnJjIikgJT4lCiAgbXV0YXRlKFBNZWNvID0gc3Vic3RyKFBNZWNvX3llYXIsIDEsIDQpLAogICAgICAgICBwbSA9IGlmZWxzZShzdWJzdHIoUE1lY29feWVhciwgMSwgMikgPT0gIkFOIiwgImFuZGVzaXRlIiwgCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdWJzdHIoUE1lY29feWVhciwgMSwgMikgPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpLCAKICAgICAgICAgZWNvID0gZmFjdG9yKAogICAgICAgICAgIGlmZWxzZShzdWJzdHIoUE1lY29feWVhciwgMywgNCkgPT0gInBwIiwgIndhcm0iLCAKICAgICAgICAgICAgICAgICAgaWZlbHNlKHN1YnN0cihQTWVjb195ZWFyLCAzLCA0KSA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICB5ZWFyID0gaWZlbHNlKGdyZXBsKCIyMDAxIiwgUE1lY29feWVhciksIDIwMDEsIDIwMDkpLAogICAgICAgICBZZWFyID0gYXMuY2hhcmFjdGVyKHllYXIpLAogICAgICAgICBmcmNfMTRjID0gY29udmVydF9mbV9kMTRjKGZtID0gZm0sIG9ic19kYXRlX3kgPSB5ZWFyLCB2ZXJib3NlID0gRkFMU0UpLAogICAgICAgICBmcmMgPSBmYWN0b3IoZnJjLCBsZXZlbHMgPSBjKCJmUE9NIiwgIm9QT00iLCAibWluQyIpKSkgJT4lCiAgcmVuYW1lKEYxNEMgPSBmbSkgJT4lCiAgc2VsZWN0KC1QTWVjb195ZWFyKQoKIyBjb21iaW5lICcwMSwgJzE5IGRhdGE7IHJtIE5BCmRlbnMuMDEuMDkuMTkuc3AuZGYgPC0gcmJpbmQoCiAgZGVucy4wMS4wOS5kZiwKICBkZW5zLjAxLjA5LjE5LmRmW2RlbnMuMDEuMDkuMTkuZGYkeWVhciA9PSAyMDE5ICYgZGVucy4wMS4wOS4xOS5kZiRseXJfYm90IDwgMzEsIG5hbWVzKGRlbnMuMDEuMDkuMTkuZGYpICVpbiUgbmFtZXMoZGVucy4wMS4wOS5kZildKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGZyY18xNGMpKQoKIyBhZGQgUE1lY29fZGVwdGggY29sCmRlbnMuMDEuMDkuMTkuc3AuZGYkUE1lY29fZGVwdGggPC0gcGFzdGUwKHN1YnN0cihkZW5zLjAxLjA5LjE5LnNwLmRmJFBNZWNvLCAxLCA0KSwgIl8iLCBkZW5zLjAxLjA5LjE5LnNwLmRmJGx5cl9ib3QgLSAxMCwgIi0iLCBkZW5zLjAxLjA5LjE5LnNwLmRmJGx5cl9ib3QpCgojIHNhdmUKc2F2ZShkZW5zLjAxLjA5LjE5LnNwLmRmLCBmaWxlID0gImRlbnMuMDEuMDkuMTkuc3AuZGYuUkRhdGEiKQoKIyBwbG90IGZjCnBsb3QuZDE0Yy50cy5meCA8LSBmdW5jdGlvbihkZiwgY29tcGFyZV92YXIpIHsKICAKICAjIHNldCBxdW9fdmFyCiAgcXVvX3ZhciA8LSBzeW0oY29tcGFyZV92YXIpCiAgCiAgIyBzZXQgZmFjZXQgdmFyIGFuZCBjb2xvciBzY2FsZXMKICBpZiAoY29tcGFyZV92YXIgPT0gInBtIikgewogICAgZl92YXIgPC0gc3ltKCJlY28iKQogICAgY3ZhbHMgPC0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsICJiYXNhbHQiID0gYmFzYWx0LCAiZ3Jhbml0ZSIgPSBncmFuaXRlKSAKICB9IGVsc2UgewogICAgZl92YXIgPC0gc3ltKCJwbSIpCiAgICBjdmFscyA8LSBjKCJ3YXJtIiA9IHdhcm0sICJjb29sIiA9IGNvb2wsICJjb2xkIiA9IGNvbGQpCiAgfQogIAogICMgc3BsaXQgYnkgZGVwdGggYW5kIHBsb3QKICBsYXBwbHkoc3BsaXQoZGYsIGRmJGx5cl9ib3QpLCBmdW5jdGlvbih4KSB7CiAgICB4ICU+JQogICAgICBmaWx0ZXIoZnJjICE9ICJvUE9NIikgJT4lCiAgICAgIG11dGF0ZShlY28gPSBmYWN0b3IoaWZlbHNlKGVjbyA9PSAid2FybSIsICJXQVJNIiwgaWZlbHNlKGVjbyA9PSAiY29vbCIsICJDT09MIiwgIkNPTEQiKSksIGxldmVscyA9IGMoIldBUk0iLCAiQ09PTCIsICJDT0xEIikpLAogICAgICAgIGZyYyA9IGlmZWxzZShmcmMgPT0gImZQT00iLCAiZnJlZSBsaWdodCIsICJoZWF2eSIpKSAlPiUKICAgIGdncGxvdCguLCBhZXMoeWVhciwgZnJjXzE0YywgY29sb3IgPSAhISBxdW9fdmFyKSkgKwogICAgZ2VvbV9saW5lKGRhdGEgPSBhdG0uMTRjLCBhZXMoeWVhciwgZDE0YyksIAogICAgICAgICAgICAgIGxpbmV0eXBlID0gMywgY29sb3IgPSAiZ3JheSIsIHNpemUgPSAuNykgKwogICAgZ2VvbV9saW5lKHNpemUgPSAxKSArCiAgICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGVjbyksIHNpemUgPSAzKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9IE5VTEwsIHZhbHVlcyA9IGN2YWxzKSArCiAgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiV0FSTSIgPSAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT09MIiA9IDE3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPTEQiID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIldBUk0iID0gIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPT0wiID0gImNvb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPTEQiID0gImNvbGQiKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoMjAwMSwgMjAwOSwgMjAxOSkpICsKICAgIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZnJjKSwgY29scyA9IHZhcnMoISEgZl92YXIpKSArCiAgICB5bGFiKGV4cHJlc3Npb24oJ0ZyYWN0aW9uICcqRGVsdGEqJydeMTQqJyAo4oCwKScpKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMiksCiAgICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgYW5nbGUgPSAwLCBzaXplID0gMTIpLAogICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSAid2hpdGUiKSwKICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgCiAgfSkKfQpgYGAKCiMjIyAxNEMgdGltZSBzZXJpZXMKCmBgYHtyIHBsb3QtY3d0LTE0Y30KIyBwbG90CnBsb3QuZDE0Yy50cy5meChkZW5zLjAxLjA5LjE5LnNwLmRmLCAicG0iKQpwbG90LmQxNGMudHMuZngoZGVucy4wMS4wOS4xOS5zcC5kZiwgImVjbyIpCmBgYAoKYGBge3IgZW1taXAtcGxvdC1meH0KIyBsaW5lYXIgbW9kcyBmb3IgVFMKbW9kLmZ4IDwtIGZ1bmN0aW9uKGZyYywgbHlyX2JvdCkgewogIGRmIDwtIGRlbnMuMDEuMDkuMTkuc3AuZGZbZGVucy4wMS4wOS4xOS5zcC5kZiRmcmMgPT0gZnJjICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVucy4wMS4wOS4xOS5zcC5kZiRseXJfYm90ID09IGx5cl9ib3QsIF0KICBkZiR5ZWFyIDwtIGRmJHllYXIgLSAyMDAwCiAgbG0oZnJjXzE0YyB+IHllYXIgKiBwbSAqIGVjbywgZGYpCn0KbW9kLmxzIDwtIGxpc3QoCiAgdHMubW9kLjEwLmZQT00gPSBtb2QuZngoImZQT00iLCAxMCksCiAgdHMubW9kLjEwLm1pbkMgPSBtb2QuZngoIm1pbkMiLCAxMCksCiAgdHMubW9kLjMwLmZQT00gPSBtb2QuZngoImZQT00iLCAzMCksCiAgdHMubW9kLjMwLm1pbkMgPSBtb2QuZngoIm1pbkMiLCAzMCkKKQoKIGVtbWlwLmZ4IDwtIGZ1bmN0aW9uKG1vZCwgdmFyKSB7CiAgIGJya3MgPC0gYygxLCA5LCAxOSkKICAgaWYgKHZhciA9PSAicG0iKSB7CiAgICAgZW1taXAobW9kLCBwbSB+IHllYXIgfCBlY28sIENJcyA9IFRSVUUsIGF0ID0gbGlzdCh5ZWFyID0gYnJrcykpJGRhdGEKICAgfSBlbHNlIHsKICAgICBlbW1pcChtb2QsIGVjbyB+IHllYXIgfCBwbSwgQ0lzID0gVFJVRSwgYXQgPSBsaXN0KHllYXIgPSBicmtzKSkkZGF0YQogICB9CiB9CgojIHJldHVybiBlbW1pcCBscwp0cy5lbW1pcC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKG1vZC5scyksIGZ1bmN0aW9uKGkpIHsKICBlbW1pcC5meChtb2QubHNbW2ldXSwgInBtIikgJT4lCiAgICBtdXRhdGUoZnJjID0gaWZlbHNlKGkgPT0gMSB8IDMsICJmUE9NIiwgIm1pbkMiKSwKICAgICAgICAgICBseXJfYm90ID0gaWZlbHNlKGkgPCAzLCAxMCwgMzApKQp9KQoKIyBwbG90IGZuCnBsb3QuZnggPC0gZnVuY3Rpb24obHMsIGRhdGEsIHZhcikgewogIAogICMgc2V0IGdyb3VwaW5nIHZhcgogIHF1b192YXIgPC0gc3ltKHZhcikKICAKICAjIHNldCBjb2xvciBwYWxldHRlICYgZmFjZXQgdmFyCiAgaWYgKHZhciA9PSAicG0iKSB7CiAgICBjdmFscyA8LSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwgImJhc2FsdCIgPSBiYXNhbHQsICJncmFuaXRlIiA9IGdyYW5pdGUpCiAgfSBlbHNlIHsKICAgIGN2YWxzIDwtIGMoIndhcm0iID0gd2FybSwgImNvb2wiID0gY29vbCwgImNvbGQiID0gY29sZCkKICB9CiAgCiAgIyBtb2RpZnkgcG9pbnQgYW5kIGF0bSBkYXRhCiAgZGF0YSA8LSBkZW5zLjAxLjA5LjE5LnNwLmRmICU+JQogICAgZmlsdGVyKGZyYyAhPSAib1BPTSIpICU+JQogICAgbXV0YXRlKGVjb0ZyYyA9IHBhc3RlMChlY28sICIgKCIsIGZyYywgIikiKSwKICAgICAgICAgICB5ZWFyID0geWVhciAtIDIwMDApCiAgYXRtLjE0YyRmcmMgPC0gYXRtLjE0YyRUeXBlCiAgCiAgIyBydW4gbG9vcAogIGxhcHBseShzZXFfYWxvbmcobHMpLCBmdW5jdGlvbihpKSB7CiAgICAKICAgICMgZ2V0IGRhdGEKICAgIGRhdGEgPC0gZGF0YVt3aGljaChkYXRhJGZyYyA9PSB1bmlxdWUobHNbW2ldXVtbImZyYyJdXSkgJgogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSRseXJfYm90ID09IHVuaXF1ZSh1bmlxdWUobHNbW2ldXVtbImx5cl9ib3QiXV0pKSksIF0KICAgIAogICAgIyBnZXQgdGl0bGUKICAgIHRpdGxlIDwtIHBhc3RlKGxzW1tpXV1bWyJmcmMiXV0sIGxzW1tpXV1bWyJseXJfYm90Il1dKQogICAgCiAgICAjIHBsb3QKICAgIGdncGxvdChsc1tbaV1dLCBhZXMoeHZhciwgeXZhcikpICsKICAgICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9ICEhIHF1b192YXIsIGxpbmV0eXBlID0gZnJjKSwgc2l6ZSA9IC44KSArCiAgICAgIGdlb21fcmliYm9uKGFlcyh5bWluID0gTENMLCB5bWF4ID0gVUNMLCBmaWxsID0gISEgcXVvX3ZhciwgbGluZXR5cGUgPSBmcmMpLCBhbHBoYSA9IC4xLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgICAgIGdlb21fcG9pbnQoZGF0YSA9IGRhdGEsCiAgICAgICAgYWVzKHllYXIsIGZyY18xNGMsIGNvbG9yID0gISEgcXVvX3Zhciwgc2hhcGUgPSBlY29GcmMpLCBzaXplID0gMS41LCBhbHBoYSA9IC44KSArCiAgICAgICMgYXRtCiAgICAgIGdlb21fbGluZShkYXRhID0gYXRtLjE0YywgYWVzKHllYXIsIGQxNGMsIGxpbmV0eXBlID0gZnJjKSwgY29sb3IgPSAiYmxhY2siKSArCiAgICAgIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gTlVMTCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKCJtaW5DIiwgImZQT00iLCAiYXRtb3NwaGVyZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygibWluQyIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZlBPTSIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXRtb3NwaGVyZSIgPSAzKSkgKwogICAgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKCJ3YXJtIChtaW5DKSIsICJjb29sIChtaW5DKSIsICJjb2xkIChtaW5DKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXJtIChmUE9NKSIsICJjb29sIChmUE9NKSIsICJjb2xkIChmUE9NKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSAobWluQykiID0gMTUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAobWluQykiID0gMTcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAobWluQykiID0gMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXJtIChmUE9NKSIgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKGZQT00pIiA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoZlBPTSkiID0gMSkpICsgIAogICAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjdmFscykgKwogICAgICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY3ZhbHMpICsKICAgICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMjApLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMSwgOSwgMTkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGV4cGFuc2lvbihhZGQgPSAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGZ1bmN0aW9uICh4KSB4ICsgMjAwMCkgKwogICAgICAjIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMTEwLCAxNzApKSArCiAgICAgIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgICAgIGdndGl0bGUodGl0bGUpICsKICAgICAgdGhlbWVfYncoKSArCiAgICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwKICAgICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQocmVwKDAsIDQpLCAiY20iKSwKICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQogIH0pCn0KCnRzLnBsb3QubHMgPC0gcGxvdC5meChscyA9IHRzLmVtbWlwLmxzLCBkYXRhID0gZGVucy4wMS4wOS4xOS5zcC5kZiwgdmFyID0gInBtIikKCmVtdHJlbmRzKGxtKGZyY18xNGMgfiB5ZWFyICogUE1lY28sIGRlbnMuMDEuMDkuMTkuc3AuZGZbZGVucy4wMS4wOS4xOS5zcC5kZiRseXJfYm90ID09ICIxMCIgJiBkZW5zLjAxLjA5LjE5LnNwLmRmJGZyYyA9PSAiZlBPTSIsIF0pLCBwYWlyd2lzZSB+IFBNZWNvLCB2YXIgPSAieWVhciIpCmBgYAoKYGBge3IgdHMtc3RhdHN9CmRlbnMuMDEuMDkuMTkuc3AuZGYkeWVhcl9pIDwtIGRlbnMuMDEuMDkuMTkuc3AuZGYkeWVhciAtIDIwMDAKCiMgZlBPTQpmUE9NLnRzLm1vZC4xMCA8LSBsbShmcmNfMTRjIH4geWVhcl9pICogcG0gKiBlY28sIAogICAgICAgICAgICAgICAgICAgICBkZW5zLjAxLjA5LjE5LnNwLmRmW2RlbnMuMDEuMDkuMTkuc3AuZGYkZnJjID09ICJmUE9NIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5zLjAxLjA5LjE5LnNwLmRmJGx5cl9ib3QgPT0gMTAsIF0pCmZQT00udHMubW9kLjIwIDwtIGxtKGZyY18xNGMgfiB5ZWFyX2kgKiBwbSAqIGVjbywgCiAgICAgICAgICAgICAgICAgICAgIGRlbnMuMDEuMDkuMTkuc3AuZGZbZGVucy4wMS4wOS4xOS5zcC5kZiRmcmMgPT0gImZQT00iICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbnMuMDEuMDkuMTkuc3AuZGYkbHlyX2JvdCA9PSAyMCwgXSkKZlBPTS50cy5tb2QuMzAgPC0gbG0oZnJjXzE0YyB+IHllYXJfaSAqIHBtICogZWNvLCAKICAgICAgICAgICAgICAgICAgICAgZGVucy4wMS4wOS4xOS5zcC5kZltkZW5zLjAxLjA5LjE5LnNwLmRmJGZyYyA9PSAiZlBPTSIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVucy4wMS4wOS4xOS5zcC5kZiRseXJfYm90ID09IDMwLCBdKQpzdW1tYXJ5KGZQT00udHMubW9kLjEwKQpzdW1tYXJ5KGZQT00udHMubW9kLjIwKQpzdW1tYXJ5KGZQT00udHMubW9kLjMwKSAjIGFsbCBucwoKIyBtaW5DCm1pbkMudHMubW9kLjEwIDwtIGxtKGZyY18xNGMgfiB5ZWFyX2kgKiBwbSAqIGVjbywgCiAgICAgICAgICAgICAgICAgICAgIGRlbnMuMDEuMDkuMTkuc3AuZGZbZGVucy4wMS4wOS4xOS5zcC5kZiRmcmMgPT0gIm1pbkMiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbnMuMDEuMDkuMTkuc3AuZGYkbHlyX2JvdCA9PSAxMCwgXSkKbWluQy50cy5tb2QuMjAgPC0gbG0oZnJjXzE0YyB+IHllYXJfaSAqIHBtICogZWNvLCAKICAgICAgICAgICAgICAgICAgICAgZGVucy4wMS4wOS4xOS5zcC5kZltkZW5zLjAxLjA5LjE5LnNwLmRmJGZyYyA9PSAibWluQyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVucy4wMS4wOS4xOS5zcC5kZiRseXJfYm90ID09IDIwLCBdKQptaW5DLnRzLm1vZC4zMCA8LSBsbShmcmNfMTRjIH4geWVhcl9pICogcG0gKiBlY28sIAogICAgICAgICAgICAgICAgICAgICBkZW5zLjAxLjA5LjE5LnNwLmRmW2RlbnMuMDEuMDkuMTkuc3AuZGYkZnJjID09ICJtaW5DIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5zLjAxLjA5LjE5LnNwLmRmJGx5cl9ib3QgPT0gMzAsIF0pCnN1bW1hcnkobWluQy50cy5tb2QuMTApCnN1bW1hcnkobWluQy50cy5tb2QuMjApCnN1bW1hcnkobWluQy50cy5tb2QuMzApICMgbW9zdCBpbnRlcmVzdGluZwoKZlBPTS50cy5tb2QuMTAuZW0gPC0gZW1tZWFucyhmUE9NLnRzLm1vZC4xMCwgcGFpcndpc2UgfiBwbSB8IGVjbykKZlBPTS50cy5tb2QuMTAuZW1pcCA8LSBlbXRyZW5kcyhmUE9NLnRzLm1vZC4xMCwgcGFpcndpc2UgfiBwbSAqIGVjbywgdmFyID0gInllYXJfaSIpCgpmUE9NLnRzLm1vZC4yMC5lbSA8LSBlbW1lYW5zKGZQT00udHMubW9kLjIwLCBwYWlyd2lzZSB+IHBtIHwgZWNvKQpmUE9NLnRzLm1vZC4yMC5lbWlwIDwtIGVtdHJlbmRzKGZQT00udHMubW9kLjIwLCBwYWlyd2lzZSB+IHBtICogZWNvLCB2YXIgPSAieWVhcl9pIikgCgptaW5DLnRzLm1vZC4xMC5lbSA8LSBlbW1lYW5zKG1pbkMudHMubW9kLjEwLCBwYWlyd2lzZSB+IHBtIHwgZWNvKQptaW5DLnRzLm1vZC4xMC5lbWlwIDwtIGVtdHJlbmRzKG1pbkMudHMubW9kLjEwLCBwYWlyd2lzZSB+IHBtICogZWNvLCB2YXIgPSAieWVhcl9pIikKCm1pbkMudHMubW9kLjIwLmVtIDwtIGVtbWVhbnMobWluQy50cy5tb2QuMjAsIHBhaXJ3aXNlIH4gcG0gfCBlY28pCm1pbkMudHMubW9kLjIwLmVtaXAgPC0gZW10cmVuZHMobWluQy50cy5tb2QuMjAsIHBhaXJ3aXNlIH4gcG0gKiBlY28sIHZhciA9ICJ5ZWFyX2kiKQoKbWluQy50cy5tb2QuMzAuZW0gPC0gZW1tZWFucyhtaW5DLnRzLm1vZC4zMCwgcGFpcndpc2UgfiBwbSB8IGVjbykKbWluQy50cy5tb2QuMzAuZW1pcCA8LSBlbXRyZW5kcyhtaW5DLnRzLm1vZC4zMCwgcGFpcndpc2UgfiBwbSAqIGVjbywgdmFyID0gInllYXJfaSIpCmBgYAoKIyMjIENoYXIgcG9vbCBjYWxjCgpgYGB7ciBwb20tbWluQy0xNGN9CiMgS29hcmFzaGkgY2hhciBlcXVhdGlvbgpjaGFyLmZ4IDwtIGZ1bmN0aW9uKHBvbV8xNGMpIHsKICAocG9tXzE0YyAtIDE0OS45KSAvIC03LjI3OCAKfQoKIyBtYWtlIGRmIG9mIHBvbSArIG1pbkMsIGNhbGN1bGF0ZSBjaGFyIEMgdXNpbmcgS29hcmFzaGkgZGF0YQpwb20uYy4xNGMuMDEuZGYgPC0gbWVyZ2UoCiAgcG9tLmMuMDEuZGYsCiAgZGVucy4wMS4wOS4xOS5zcC5kZiAlPiUKICAgIGZpbHRlcih5ZWFyID09IDIwMDEpLAogIGJ5ID0gYygiUE1lY28iLCAiZnJjIiwgImx5cl9ib3QiKSkgJT4lCiAgbXV0YXRlKHd0ZF8xNGMgPSBjX1BPTV9mcmMgKiBmcmNfMTRjKSAlPiUKICBncm91cF9ieShQTWVjbywgcG0sIGVjbywgbHlyX2JvdCwgc29jX1BPTSwgeWVhcikgJT4lCiAgc3VtbWFyaXplKHBvbV8xNGMgPSBzdW0od3RkXzE0YykpCnBvbS5jLjE0Yy4wMS5kZiA8LSBwb20uYy4xNGMuMDEuZGYgJT4lCiAgbXV0YXRlKGNfcGN0X2NoYXIgPSBjaGFyLmZ4KHBvbV8xNGMpLAogICAgICAgICBzb2NfY2hhciA9IGNfcGN0X2NoYXIgKiBzb2NfUE9NICogMTBeLTIsCiAgICAgICAgIHNvY19ub25DaGFyID0gc29jX1BPTSAtIHNvY19jaGFyLAogICAgICAgICBkMTRjX2NoYXIgPSAtNTc3LjksCiAgICAgICAgIGQxNGNfbm9uQ2hhciA9IChwb21fMTRjIC0gZDE0Y19jaGFyICogY19wY3RfY2hhcikgLyAoMTAwIC0gY19wY3RfY2hhcikpCmdncGxvdChwb20uYy4xNGMuMDEuZGYsIGFlcyhlY28sIGQxNGNfbm9uQ2hhciwgZmlsbCA9IHBtKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMobHlyX2JvdCkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyAjIGNhbGMuIGNoYXIgZm9yIG9QT00gb25seQojIG9wb20uYy4xNGMuMDEuZGYgPC0gbWVyZ2UoCiMgICBiaW5kX3Jvd3Moc29jLjIwMDEuZnJjU09DLnNwLmRmJE9QT00sIC5pZCA9ICJQTWVjbyIpICU+JQojICAgICBtdXRhdGUoZnJjID0gIm9QT00iKSwKIyAgIGRlbnMuMDEuMTkuZGYgJT4lCiMgICAgIGZpbHRlcih5ZWFyID09IDIwMDEpLAojICAgYnkgPSBjKCJQTWVjbyIsICJmcmMiLCAibHlyX2JvdCIpKSAlPiUKIyAgIG11dGF0ZShjX3BjdF9jaGFyID0gY2hhci5meChmcmNfMTRjKSwKIyAgICAgICAgICBzb2NfY2hhciA9IGNfcGN0X2NoYXIgKiBseXJfc29jICogMTBeLTIsCiMgICAgICAgICAgc29jX25vbkNoYXIgPSBseXJfc29jIC0gc29jX2NoYXIsCiMgICAgICAgICAgZDE0Y19jaGFyID0gLTU3Ny45LAojICAgICAgICAgIGQxNGNfbm9uQ2hhciA9IChmcmNfMTRjIC0gZDE0Y19jaGFyICogY19wY3RfY2hhcikgLyAoMTAwIC0gY19wY3RfY2hhcikpCiMgZ2dwbG90KG9wb20uYy4xNGMuMDEuZGYsIGFlcyhlY28sIGNfcGN0X2NoYXIsIGZpbGwgPSBwbSkpICsKIyAgIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwojICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwojICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhseXJfYm90KSkgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCiMjIyBGcmFjdGlvbiB2cyByZXNwaXJlZCAxNEMKCmBgYHtyIHBsb3QtTEYtaW5jfQojIGxvYWQgZGF0YQpsb2FkKCIvVXNlcnMvamVmZi9zcmEtdHMvc291cmNlL3NyYS5hbGwubWluLlJEYXRhIikKbG9hZCgiL1VzZXJzL2plZmYvc3JhLXRzL3NvdXJjZS9zcmEuaW5jLmFsbC5SRGF0YSIpICMgb3JpZ2luYWwgZGVwdGhzCmxvYWQoIi9Vc2Vycy9qZWZmL3NyYS10cy9zb3VyY2Uvc3JhLjE5LjAxLmluYy5SRGF0YSIpICMgc3BsaW5lZApsb2FkKCIvVXNlcnMvamVmZi9zcmEtdHMvc291cmNlL3NyYS4yMDAxLmluYy5scy5SRGF0YSIpICMgcmVwcyAnMDEKbG9hZCgiL1VzZXJzL2plZmYvc3JhLXRzL3NvdXJjZS9zcmEuMjAxOS5pbmMubHMuUkRhdGEiKSAjIHJlcHMgJzE5CgojIGNvbnZlcnQgZGVucy5kZiB0byB3aWRlCmRlbnMuMDEuMTkuZGYudyA8LSBkZW5zLjAxLjA5LjE5LmRmICU+JQogIHNlbGVjdChQTWVjbywgWWVhciwgZnJjLCBseXJfYm90LCBmcmNfMTRjKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZnJjLCB2YWx1ZXNfZnJvbSA9IGZyY18xNGMpCmRlbnMuaW5jLm1pbi53IDwtIG1lcmdlKAogIHNyYS5pbmMuYWxsICU+JQogICAgZmlsdGVyKGQxNGNfbWVhbiA+IC03MCksCiAgZGVucy4wMS4xOS5kZi53ICU+JQogICAgbXV0YXRlKHBtID0gaWZlbHNlKGdyZXBsKCJBTiIsIFBNZWNvKSwgImFuZGVzaXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJCUyIsIFBNZWNvKSwgImJhc2FsdCIsICJncmFuaXRlIikpLAogICAgICAgICAgIGVjbyA9IGlmZWxzZShncmVwbCgicHAiLCBQTWVjbyksICJ3YXJtIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgid2YiLCBQTWVjbyksICJjb29sIiwgImNvbGQiKSkpKQoKIyBkZXB0aCBpbmRleCBmeApkZXB0aC5peC5meCA8LSBmdW5jdGlvbihkZiwgc3BsaXRfdmFyX2EgPSAiWWVhciIsIHNwbGl0X3Zhcl9iID0gIlBNZWNvIikgewogIGJpbmRfcm93cygKICAgIGxhcHBseShzcGxpdChkZiwgZGZbW3NwbGl0X3Zhcl9hXV0pLCBmdW5jdGlvbih4KSAKICAgICAgYmluZF9yb3dzKGxhcHBseShzcGxpdCh4LCB4W1tzcGxpdF92YXJfYl1dKSwgZnVuY3Rpb24oeSkgewogICAgICAgIGlmIChpcy5udWxsKHkkZGVwdGgpKSB7CiAgICAgICAgICB5W29yZGVyKHkkbHlyX2JvdCksIF0gJT4lCiAgICAgICAgICAgIG11dGF0ZShkZXB0aCA9IHNlcSgxLCBucm93KHkpKSkgCiAgICAgICAgfQogICAgICB9KSkKICAgICAgKQogICAgKQp9CgojIG1ha2UgcmVwcyBkZgpkZW5zLmluYy5yZXBzLncgPC0gbWVyZ2UoCiAgYmluZF9yb3dzKAogICAgbWFwcGx5KHJiaW5kLCAKICAgICAgICAgICBzcmEuMjAxOS5pbmMubHMsCiAgICAgICAgICAgc3JhLjIwMDEuaW5jLmxzLAogICAgICAgICAgIFNJTVBMSUZZID0gRkFMU0UpKSwKICBkZW5zLjAxLjE5LmRmLncgJT4lCiAgICBmaWx0ZXIoWWVhciAhPSAyMDA5KSkgJT4lCiAgbXV0YXRlKHBtID0gaWZlbHNlKGdyZXBsKCJBTiIsIFBNZWNvKSwgImFuZGVzaXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJCUyIsIFBNZWNvKSwgImJhc2FsdCIsICJncmFuaXRlIikpLAogICAgICAgICBlY28gPSBpZmVsc2UoZ3JlcGwoInBwIiwgUE1lY28pLCAid2FybSIsIAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIndmIiwgUE1lY28pLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICB5ZWFyID0gZmFjdG9yKFllYXIpKSAlPiUKICBmaWx0ZXIoZDE0YyA+IC03MCkKZGVucy5pbmMucmVwcy53IDwtIGJpbmRfcm93cygKICBsYXBwbHkoc3BsaXQoZGVucy5pbmMucmVwcy53LCBkZW5zLmluYy5yZXBzLnckWWVhciksIGZ1bmN0aW9uKHgpIGRlcHRoLml4LmZ4KHgsIHNwbGl0X3Zhcl9hID0gInJlcCIpKSkKCiMgYWRkIGRlcHRoIGluZGV4IGNvbApkZW5zLmluYy5taW4udyA8LSBkZXB0aC5peC5meChkZW5zLmluYy5taW4udykKCiMgcGxvdCBpbmMgdiBMRgojIHBsb3QgcHJvZmlsZXMgYnkgeWVhciBhbmQgZnJhY3Rpb24gdHlwZQppbmMucGxvdC5meCA8LSBmdW5jdGlvbihkZW5zLmluYy5kZiwgZnJjLCBZZWFyKSB7CiAgCiAgcXVvX3ZhciA8LSBzeW0oZnJjKQogIHlsYWIgPC0gaWZlbHNlKGZyYyA9PSAiZlBPTSIsIGV4cHJlc3Npb24oJ2ZyZWUgbGlnaHQgQyAnKkRlbHRhKicnXjE0KidDICjigLApJyksIAogICAgICAgICAgICAgICAgIGlmZWxzZShmcmMgPT0gIm9QT00iLCAKICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbignb2NjbHVkZWQgbGlnaHQgQyAnKkRlbHRhKicnXjE0KidDICjigLApJyksCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24oJ21pbi1hc3NvYy4gQyAnKkRlbHRhKicnXjE0KidDICjigLApJykpKQogIGRlbnMuaW5jLmRmICU+JQogICAgZmlsdGVyKGQxNGNfbWVhbiA+IC03MCkgJT4lCiAgICBnZ3Bsb3QoLiwgYWVzKGQxNGNfbWVhbiwgISEgcXVvX3ZhciwgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28pKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJsaWdodGdyYXkiKSArCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJsaWdodGdyYXkiKSArCiAgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICAgIGdlb21fZXJyb3JiYXJoKGFlcyh4bWF4ID0gZDE0Y191LCB4bWluID0gZDE0Y19sKSwgaGVpZ2h0ID0gMSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKICAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkNsaW1hdGUiLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE2KSkgKwogICAgIyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoLTEyMCwgMTEwKSwgeWxpbSA9IGMoLTEyMCwgMTEwKSkgKwogICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhkZXB0aCksIHJvd3MgPSB2YXJzKFllYXIpKSArIAogICAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDLUNPJ1syXSonICjigLApJykpICsKICAgIHlsYWIoeWxhYikgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkKfQoKIyBwbG90IHJlc3BpcmVkIGFnYWluc3Qgbm9uQ2hhcjsgc3BsaW5lZCBkYXRhOyAnMDEgb25seQpkZW5zLmluYy5ub25DaGFyLmRmIDwtIG1lcmdlKAogIHBvbS5jLjE0Yy4wMS5kZlsgLCBjKCJQTWVjbyIsICJwbSIsICJlY28iLCAibHlyX2JvdCIsICJ5ZWFyIiwgImQxNGNfbm9uQ2hhciIpXSwKICBzcmEuMTkuMDEuaW5jWyAsIHdoaWNoKCEobmFtZXMoc3JhLjE5LjAxLmluYykgJWluJSBjKCJQTSIsICJFQ08iKSkpXSkKICAKZGVucy5pbmMubm9uQ2hhci5kZiAlPiUKICBmaWx0ZXIoZDE0YyA+IC03MCkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjLCBkMTRjX25vbkNoYXIsIGNvbG9yID0gcG0pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAibGlnaHRncmF5IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImxpZ2h0Z3JheSIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGVjbyksIHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBkMTRjX21pbiwgeG1heCA9IGQxNGNfbWF4KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiQ2xpbWF0ZSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTYpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhseXJfYm90KSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQy1DTydbMl0qJyAo4oCwKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdub24tY2hhciAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEpCmBgYAoKYGBge3IgcGxvdC1pbmMtZGVuc30KaW5jLnBsb3QuZngoZGVucy5pbmMubWluLncsICJmUE9NIiwgIjIwMTkiKSAKaW5jLnBsb3QuZngoZGVucy5pbmMubWluLncsICJvUE9NIikKaW5jLnBsb3QuZngoZGVucy5pbmMubWluLncsICJtaW5DIiwgIjIwMTkiKQppbmMucGxvdC5meChkZW5zLmluYy5taW4udywgIm1pbkMiLCAiMjAwMSIpCmBgYAoKYGBge3Igc3RhdHMtZnJjLXJlc3B9CmZQT00ucmVzcC5tb2QgPC0gbG0oZlBPTSB+IGQxNGMgKiBwbSAqIGVjbywgZGVucy5pbmMucmVwcy53KQptaW5DLnJlc3AubW9kIDwtIGxtKG1pbkMgfiBkMTRjICogcG0gKiBlY28gKyB5ZWFyLCBkZW5zLmluYy5yZXBzLncpCm1pbkMucmVzcC5tb2QuMDEgPC0gbG0obWluQyB+IGQxNGMgKiBwbSAqIGVjbywgCiAgICAgICAgICAgICAgICAgICAgICAgZGVucy5pbmMucmVwcy53W2RlbnMuaW5jLnJlcHMudyRZZWFyID09ICIyMDAxIiwgXSkKbWluQy5yZXNwLm1vZC4xOSA8LSBsbShtaW5DIH4gZDE0YyAqIHBtICogZWNvLCAKICAgICAgICAgICAgICAgICAgICAgICBkZW5zLmluYy5yZXBzLndbZGVucy5pbmMucmVwcy53JFllYXIgPT0gIjIwMTkiLCBdKQoKc3VtbWFyeShmUE9NLnJlc3AubW9kKQpzdW1tYXJ5KG1pbkMucmVzcC5tb2QpCgpmUE9NLnJlc3AuZW0uUE1lY28gPC0gZW1tZWFucyhmUE9NLnJlc3AubW9kLCBwYWlyd2lzZSB+IHBtIHwgZWNvKQpmUE9NLnJlc3AuZW0uRUNPcG0gPC0gZW1tZWFucyhmUE9NLnJlc3AubW9kLCBwYWlyd2lzZSB+IGVjbyB8IHBtKQpmUE9NLnJlc3AuZW1pcC5lY28gPC0gZW10cmVuZHMoZlBPTS5yZXNwLm1vZCwgcGFpcndpc2UgfiBlY28sIHZhciA9ICJkMTRjIikgIyBucwpmUE9NLnJlc3AuZW1pcC5wbSA8LSBlbXRyZW5kcyhmUE9NLnJlc3AubW9kLCBwYWlyd2lzZSB+IHBtLCB2YXIgPSAiZDE0YyIpICMgbnMKCm1pbkMucmVzcC5lbS5QTWVjbyA8LSBlbW1lYW5zKG1pbkMucmVzcC5tb2QsIHBhaXJ3aXNlIH4gcG0gfCBlY28pCm1pbkMucmVzcC5lbS5FQ09wbSA8LSBlbW1lYW5zKG1pbkMucmVzcC5tb2QsIHBhaXJ3aXNlIH4gZWNvIHwgcG0pCm1pbkMucmVzcC5lbWlwLmVjbyA8LSBlbXRyZW5kcyhtaW5DLnJlc3AubW9kLCBwYWlyd2lzZSB+IGVjbywgdmFyID0gImQxNGMiKSAKIyBjb2xkIC0gd2FybSBwID0gMC4wMTc2LCBlc3QgZGlmID0gLS40NAptaW5DLnJlc3AuZW1pcC5wbSA8LSBlbXRyZW5kcyhtaW5DLnJlc3AubW9kLCBwYWlyd2lzZSB+IHBtLCB2YXIgPSAiZDE0YyIpICMgbnMKYGBgCgpgYGB7ciBmcmMtcmVzcC1wbG90cy1lZ3V9CiMgcGxvdCBmeApkZW5zLmluYy5wbG90LmZ4IDwtIGZ1bmN0aW9uKGRmLCB2YXIsIGQxNGNfdmFyLCBmX3Zhcl9jID0gTkEsIGZfdmFyX3IgPSBOQSwgZnJjX2ZpbHRlciA9IE5BLCBzbW9vdGggPSBGQUxTRSwgYnlfZ3JvdXAgPSBUUlVFKSB7CiAgCiAgIyBxdW90ZSB2YXJzCiAgcXVvX3ZhciA8LSBzeW0odmFyKQogIHF1b19kMTRjX3ZhciA8LSBzeW0oZDE0Y192YXIpCiAgCiAgIyBtdXRhdGUgZGYKICBkZiA8LSBkZiAlPiUKICAgIHNlbGVjdCghb1BPTSkgJT4lCiAgICBwaXZvdF9sb25nZXIoY29scyA9IGMoZlBPTSwgbWluQyksIG5hbWVzX3RvID0gImZyYyIsIHZhbHVlc190byA9ICJmcmNfMTRjIikgJT4lCiAgICBtdXRhdGUoZnJjID0gaWZlbHNlKGZyYyA9PSAiZlBPTSIsICJmcmVlIGxpZ2h0IiwgImhlYXZ5IiksCiAgICAgICAgICAgZWNvRnJjID0gcGFzdGUwKGVjbywgIiAoIiwgZnJjLCAiKSIpKQogIAogICMgc2V0IGNvbG9ycwogIGlmICh2YXIgPT0gInBtIikgewogICAgY29sX25hbWUgPC0gIlBhcmVudCBtYXRlcmlhbCIKICAgIGN2YWxzIDwtIGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLCAiYmFzYWx0IiA9IGJhc2FsdCwgImdyYW5pdGUiID0gZ3Jhbml0ZSkgCiAgfSBlbHNlIHsKICAgIGNvbF9uYW1lIDwtICJDbGltYXRlIgogICAgY3ZhbHMgPC0gYygid2FybSIgPSB3YXJtLCAiY29vbCIgPSBjb29sLCAiY29sZCIgPSBjb2xkKQogIH0KICAKICAjIGZyYyBmaWx0ZXIKICBpZiAoIWlzLm5hKGZyY19maWx0ZXIpKSB7CiAgICBkZiA8LSBkZiAlPiUKICAgICAgZmlsdGVyKGZyYyA9PSBmcmNfZmlsdGVyKQogICAgaWYgKGZyY19maWx0ZXIgPT0gImZyZWUgbGlnaHQiKSB7CiAgICAgIHNocF92YWxzIDwtIGMoIndhcm0gKGZyZWUgbGlnaHQpIiA9IDAsCiAgICAgICAgICAgICAgICAgICAiY29vbCAoZnJlZSBsaWdodCkiID0gMiwKICAgICAgICAgICAgICAgICAgICJjb2xkIChmcmVlIGxpZ2h0KSIgPSAxKQogICAgfSBlbHNlIHsKICAgICAgc2hwX3ZhbHMgPC0gYygid2FybSAoaGVhdnkpIiA9IDE1LAogICAgICAgICAgICAgICAgICAgImNvb2wgKGhlYXZ5KSIgPSAxNywKICAgICAgICAgICAgICAgICAgICJjb2xkIChoZWF2eSkiID0gMTYpCiAgICB9CiAgfQogIAogIGlmIChieV9ncm91cCkgewogICAgcCA8LSBnZ3Bsb3QoZGYsIGFlcyghISBxdW9fZDE0Y192YXIsIGZyY18xNGMsIGNvbG9yID0gISEgcXVvX3ZhcikpIAogIH0gZWxzZSB7CiAgICBwIDwtIGdncGxvdChkZiwgYWVzKCEhIHF1b19kMTRjX3ZhciwgZnJjXzE0YykpIAogIH0KICBwIDwtIHAgKwogICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9IGNvbF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGN2YWxzKSArCiAgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJDbGltYXRlIChmcmFjdGlvbikiLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHNocF92YWxzKSArCiAgICBzY2FsZV9zaXplKG5hbWUgPSAiRGVwdGgiLAogICAgICAgICAgICAgICBicmVha3MgPSBjKDIsIDMsIDQpLAogICAgICAgICAgICAgICByYW5nZSA9IGMoMiwgNCksCiAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjEiLCAiMiIsICIzIikpICsKICAgICMgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKC0xNDAsIDE5MCksIHlsaW0gPSBjKC0xNDAsIDE5MCkpICsKICAgIHlsYWIoZXhwcmVzc2lvbignRnJhY3Rpb24gJypEZWx0YSonJ14xNConICjigLApJykpICsKICAgIHhsYWIoZXhwcmVzc2lvbignUmVzcGlyZWQgJypEZWx0YSonJ14xNConQy1DTydbMl0qJyAo4oCwKScpKSArCiAgICBndWlkZXMoc2l6ZSA9ICJub25lIiwKICAgICAgICAgICBzaGFwZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzKSkpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsCiAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTIpLAogICAgICAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIGFuZ2xlID0gMCwgc2l6ZSA9IDEyKSwKICAgICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gIndoaXRlIiksCiAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKQogIAogIGlmICghaXMubmEoZnJjX2ZpbHRlcikpIHsKICAgIHAgKyBnZ3RpdGxlKGZyY19maWx0ZXIpCiAgfQogIAogIGlmICghaXMubmEoZl92YXJfYykpIHsKICAgIHF1b19mX3Zhcl9jIDwtIHN5bShmX3Zhcl9jKQogICAgaWYgKGlzLm5hKGZfdmFyX3IpKSB7CiAgICAgIHAgPC0gcCArIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoISEgcXVvX2ZfdmFyX2MpKQogICAgfSBlbHNlIHsKICAgICAgcXVvX2ZfdmFyX3IgPC0gc3ltKGZfdmFyX3IpCiAgICAgIHAgPC0gcCArIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoISEgcXVvX2ZfdmFyX2MpLCByb3dzID0gdmFycyghISBxdW9fZl92YXJfcikpIAogICAgfQogIH0KICAKICBpZiAoc21vb3RoKSB7CiAgICBpZiAoYnlfZ3JvdXApIHsKICAgICAgcCA8LSBwICsgCiAgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIGZvcm11bGEgPSB5IH4geCwgc2UgPSBGQUxTRSwgc2l6ZSA9IDEuMikKICAgIH0gZWxzZSB7CiAgICAgIHAgPC0gcCArIAogICAgICAgIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBmb3JtdWxhID0geSB+IHgsIHNlID0gRkFMU0UsIHNpemUgPSAxLjIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikKICAgIH0KICAgIHAgPC0gcCArCiAgICAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gZWNvRnJjLCBzaXplID0gZGVwdGgsIGNvbG9yID0gISEgcXVvX3ZhciksIGFscGhhID0gLjMpCiAgICAgIGlmIChkMTRjX3ZhciA9PSAiZDE0Y19tZWFuIikgewogICAgICAgIHAgPC0gcCArIAogICAgICAgICAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtYXggPSBkMTRjX3UsIHhtaW4gPSBkMTRjX2wsIGNvbG9yID0gISEgcXVvX3ZhciksIAogICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMSwgYWxwaGEgPSAuMykKICAgICAgfQogICAgcCArCiAgICAgIGd1aWRlcyhzaGFwZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLCBhbHBoYSA9IDEpKSkKICB9IGVsc2UgewogICAgcCA8LSBwICsKICAgICAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBlY29GcmMsIHNpemUgPSBkZXB0aCwgY29sb3IgPSAhISBxdW9fdmFyKSkKICAgIGlmIChkMTRjX3ZhciA9PSAiZDE0Y19tZWFuIikgewogICAgICBwIDwtIHAgKwogICAgICAgIGdlb21fZXJyb3JiYXJoKGFlcyh4bWF4ID0gZDE0Y191LCB4bWluID0gZDE0Y19sLCBjb2xvciA9ICEhIHF1b192YXIpLCAKICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAxLCBhbHBoYSA9IC4zKQogICAgfQogICAgcAogIH0KfQpgYGAKCmBgYHtyIHBsb3QtZnJjLWluYy1lZ3V9CmRlbnMuaW5jLnBsb3QuZngoZGYgPSBkZW5zLmluYy5taW4udywgdmFyID0gInBtIiwgZDE0Y192YXIgPSAiZDE0Y19tZWFuIiwgZnJjX2ZpbHRlciA9ICJmcmVlIGxpZ2h0IikKIyBkZW5zLmluYy5wbG90LmZ4KGRmID0gZGVucy5pbmMubWluLncsIHZhciA9ICJwbSIsIGQxNGNfdmFyID0gImQxNGNfbWVhbiIsIGZyY19maWx0ZXIgPSAiZnJlZSBsaWdodCIsIHNtb290aCA9IFQsIGJ5X2dyb3VwID0gRikKZGVucy5pbmMucGxvdC5meChkZiA9IGRlbnMuaW5jLm1pbi53LCB2YXIgPSAicG0iLCBkMTRjX3ZhciA9ICJkMTRjX21lYW4iLCBmcmNfZmlsdGVyID0gImZyZWUgbGlnaHQiLCBzbW9vdGggPSBULCBieV9ncm91cCA9IFQpCmRlbnMuaW5jLnBsb3QuZngoZGYgPSBkZW5zLmluYy5taW4udywgdmFyID0gInBtIiwgZDE0Y192YXIgPSAiZDE0Y19tZWFuIiwgZnJjX2ZpbHRlciA9ICJoZWF2eSIpCmRlbnMuaW5jLnBsb3QuZngoZGYgPSBkZW5zLmluYy5taW4udywgdmFyID0gInBtIiwgZDE0Y192YXIgPSAiZDE0Y19tZWFuIiwgZnJjX2ZpbHRlciA9ICJoZWF2eSIsIHNtb290aCA9IFQpCmRlbnMuaW5jLnBsb3QuZngoZGYgPSBkZW5zLmluYy5taW4udywgdmFyID0gImVjbyIsIGQxNGNfdmFyID0gImQxNGNfbWVhbiIsIGZyY19maWx0ZXIgPSAiaGVhdnkiLCBzbW9vdGggPSBUKQpkZW5zLmluYy5wbG90LmZ4KGRmID0gZGVucy5pbmMubWluLncsIHZhciA9ICJlY28iLCBkMTRjX3ZhciA9ICJkMTRjX21lYW4iLCBmcmNfZmlsdGVyID0gImZyZWUgbGlnaHQiLCBzbW9vdGggPSBUKQpgYGAKCiMjIFRoZXJtYWwgZnJhY3Rpb25zCiMjIyBDIHJlbGVhc2UgKHRoZXJtb2dyYW1zKQpgYGB7ciB0aGVybWFsLWRhdGF9CiMgbG9hZCB0aGVybW9ncmFtIGRhdGEgYW5kIGNvbWJpbmUKQU53Zi4zMC5IRl90bWwgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZXh0ZXJuYWwvc3JhX3RobWxfMTRDX3N0b25lci9zbW9vdGhfQU53ZiBNT01fUlBPLmNzdiIpCkJTd2YuMzAuSEZfdG1sIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2V4dGVybmFsL3NyYV90aG1sXzE0Q19zdG9uZXIvc21vb3RoX0JTd2YgMjAtMzAgRnJhYyBmaXguY3N2IikKR1J3Zi4zMC5IRl90bWwgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZXh0ZXJuYWwvc3JhX3RobWxfMTRDX3N0b25lci9zbW9vdGhfR1J3ZiBNT01fUlBPLmNzdiIpCkhGX3RtbC5kZiA8LSBjYmluZChyYmluZChBTndmLjMwLkhGX3RtbCwgQlN3Zi4zMC5IRl90bWwsIEdSd2YuMzAuSEZfdG1sKSwgCiAgICAgICAgICAgICAgICAgICBzaXRlID0gYyhyZXAoIkFOd2YiLCBucm93KEFOd2YuMzAuSEZfdG1sKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJCU3dmIiwgbnJvdyhCU3dmLjMwLkhGX3RtbCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgiR1J3ZiIsIG5yb3coR1J3Zi4zMC5IRl90bWwpKSkpCkhGX3RtbC5kZiRQTSA8LSBzdWJzdHIoSEZfdG1sLmRmJHNpdGUsIDEsIDIpCgojIHRlbXAgY3V0cyBkZgpIRl90bWwudGVtcHMuZGYgPC0gZGF0YS5mcmFtZSgKICBQTSA9IHJlcChjKCJBTiIsICJCUyIsICJHUiIpLCBlYSA9IDUpLAogIGN1dCA9IHJlcCgxOjUsIDMpLAogIHRlbXAgPSBjKDE0MCwgMjQ1LCAzNDAsIDM5MCwgNDk1LAogICAgICAgICAgIDE0MS41LCAyNDYuNSwgMjkwLCAzNjQsIDQ4NCwKICAgICAgICAgICAxNDMsIDI0OCwgMjkzLCAzNjcsIDQ4NykKKQoKIyBwbG90CmdncGxvdChIRl90bWwuZGYsIGFlcyh0ZW1wLCBNb3ZpbmcsIGNvbG9yID0gUE0pKSArCiAgIyBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gdGVtcCwgY29sb3IgPSBQTSksCiAgIyAgICAgICAgICAgIGRhdGEgPSBIRl90bWwudGVtcHMuZGYsCiAgIyAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIGFscGhhID0gLjUsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkFOIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgojIyMgVGhlcm1hbCBmcmFjdGlvbiAxNEMKCmBgYHtyIHRtbC0xNGN9CiMgd3JhbmdsZSAxNEMgZGF0YSB0byBkZgpmcmMuMTRjLmRmIDwtIGJpbmRfcm93cyhhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1mcmMxOS1NT00tdGhtbF8yMDIyLTAxLTIwYCkgJT4lIAogIGRwbHlyOjpzbGljZSgxOjE1KSAlPiUKICBtdXRhdGUoUE0gPSBzdWJzdHIoUHJvYmUsIDEsIDIpLAogICAgICAgICBFQ08gPSAid2YiLCAKICAgICAgICAgdGhtbF9mcmMgPSBhcy5udW1lcmljKHN1YnN0cihQcm9iZSwgbmNoYXIoUHJvYmUpLCBuY2hhcihQcm9iZSkpKSkgJT4lCiAgIyBmaXggU2hhbmUncyBtaXNsYWJlbGluZyBvZiAxNEMgZGF0YQogIG11dGF0ZShQTSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiR1IiLCBpZmVsc2UoUE0gPT0gIkdSIiwgIkFOIiwgUE0pKSkgJT4lCiAgcmVuYW1lKGZtID0gRjE0QywgZm1fZXJyID0gZXJyLCBkMTRjID0gYOKIhjE0Qy4o4oCwKWAsIGQxNGNfZXJyID0gYGVyci4o4oCwKWApICU+JQogIHNlbGVjdChQTSwgRUNPLCB0aG1sX2ZyYywgZDE0YywgZDE0Y19lcnIsIGZtLCBmbV9lcnIpCgojIHBsb3QKZ2dwbG90KGZyYy4xNGMuZGYsIGFlcyh0aG1sX2ZyYywgZDE0YywgZmlsbCA9IFBNKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkFOIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSBncmFuaXRlKSkgKyAKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKFBNKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIHN0ZXAgcGxvdApmcmMuMTRjLmRmICU+JQogIGZpbHRlcih0aG1sX2ZyYyA9PSA1KSAlPiUKICBtdXRhdGUodGhtbF9mcmMgPSA2KSAlPiUKICByYmluZChmcmMuMTRjLmRmLCAuKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHRobWxfZnJjLCBkMTRjLCBjb2xvciA9IFBNKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX3N0ZXAoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSBncmFuaXRlKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDEuNSwgNS41KSwgbGFiZWxzID0gYXMuY2hhcmFjdGVyKHNlcSgxLCA1KSkpICsKICB5bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHhsYWIoIlRoZXJtYWwgZnJhY3Rpb24iKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciB0bWwtZnJjLWN9CmNzdi5kaXIgPC0gIi4uL2RhdGEvZXh0ZXJuYWwvc3JhX3RobWxfMTRDX3N0b25lciIKbm1zIDwtIGxpc3QuZmlsZXMocGF0aCA9IGNzdi5kaXIsIHBhdHRlcm4gPSAiKi5jc3YiKQpubXNfc21vb3RoIDwtIG5tc1t3aGljaChncmVwbCgic21vb3RoIiwgbm1zKSldCmNzdmxpc3QgPC0gbGFwcGx5KHNlcV9hbG9uZyhubXNfc21vb3RoKSwgZnVuY3Rpb24oaSkgewogIHJlYWQuY3N2KHBhc3RlKGNzdi5kaXIsIG5tc19zbW9vdGhbaV0sIHNlcCA9ICIvIikpCn0pCm5hbWVzKGNzdmxpc3QpIDwtIHNhcHBseShubXNfc21vb3RoLCBzdWJzdHIsIHN0YXJ0ID0gOCwgc3RvcCA9IDExLCBVU0UuTkFNRVMgPSBGQUxTRSkKIyBmcmMuZnggPC0gZnVuY3Rpb24oZGF0LCB0ZW1wc19pbikgewojICAgZGF0IDwtIGRhdCAlPiUKIyAgICAgZmlsdGVyKCFpcy5uYShDTzJfc2NhbGVkKSB8ICFpcy5uYSh0ZW1wKSkgJT4lCiMgICAgIHNlbGVjdCh0ZW1wLCBDTzJfc2NhbGVkKSAlPiUKIyAgICAgcmVuYW1lKFRlbXBfYXYgPSB0ZW1wLAojICAgICAgICAgICAgQ08yX2F2ID0gQ08yX3NjYWxlZCkKIyAgIAojICAgIyBmaXQgc3BsaW5lCiMgICAjIHNldCBrbm90cwojICAgbWF4dGVtcCA8LSBtYXgoZGF0JFRlbXBfYXYpCiMgICB0ZW1wcyA8LSBjKHRlbXBzX2luLCBtYXh0ZW1wKSAjVG8gZXN0YWJsaXNoIHVwcGVyIGxpbWl0CiMgICAKIyAgICMgZGVmaW5lIHNwbGluZQojICAgc3BfZnVuIDwtIHNwbGluZWZ1bihkYXQkVGVtcF9hdiwgZGF0JENPMl9hdiwgbWV0aG9kID0gJ2ZtbScpCiMgICB0b2wgPC0gMS41ZS00ICogMgojICAgYXJlYWxpc3QgPC0gbGlzdCgpCiMgICBsIDwtIDEKIyAgIHUgPC0gMQojICAgCiMgICAjIHJ1biBzcGxpbmUKIyAgIGZvciAoaSBpbiB0ZW1wcykgewojICAgICBpZiAodSA9PSAxKXsKIyAgICAgICBsb3dlciA8LSAxMDAKIyAgICAgICB1cHBlciA8LSB0ZW1wc1t1XQojICAgICAgIHUgPC0gdSsxCiMgICAgIH0gZWxzZSB7CiMgICAgICAgbG93ZXIgPC0gdGVtcHNbbF0KIyAgICAgICB1cHBlciA8LSB0ZW1wc1t1XQojICAgICAgIHUgPC0gdSArIDEKIyAgICAgICBsIDwtIGwgKyAxCiMgICAgIH0KIyAgICAgCiMgICAgICMgY2FsYyBhcmVhCiMgICAgIGFyZWEgPC0gaW50ZWdyYXRlKHNwX2Z1biwgbG93ZXIsIHVwcGVyLCBzdWJkaXZpc2lvbnMgPSA4MDAwLCByZWwudG9sID0gdG9sKQojICAgICBhcmVhbGlzdCA8LSBjKGFyZWFsaXN0LCBhcmVhWzFdKQojICAgfQojICAgCiMgICAjIyMgQ08yIC0gbW9kZWxsZWQgZml0CiMgICBhcmVhX3VuIDwtIHVubGlzdChhcmVhbGlzdCkKIyAgIHRvdGFsYXJlYSA8LSBpbnRlZ3JhdGUoc3BfZnVuLCA4MCwgbWF4dGVtcCwgc3ViZGl2aXNpb25zID0gODAwMCwgcmVsLnRvbCA9IHRvbClbMV0KIyAgIHRvdGFsYXJlYV9pbnQgPC0gYXMubnVtZXJpYyh1bmxpc3QodG90YWxhcmVhKSkKIyAgIAojICAgI0NhbGN1bGF0ZSB0b3RhbCBhcmVhIHRoZSByaWdodCB3YXkKIyAgIGZyYWN0aW9ucyA8LSBjKCkKIyAgIGZvciAoeSBpbiAxOmxlbmd0aCh0ZW1wcykpIHsKIyAgICAgdGhpc3RlbXAgPC0gdGVtcHNbeV0KIyAgICAgQ08yYXJlYSA8LSAwCiMgICAgIGlmICh5ID09IDEpIHsKIyAgICAgICBDTzJhcmVhX2ludCA8LSBpbnRlZ3JhdGUoc3BfZnVuLCA4MCwgdGVtcHNbeV0sIHN1YmRpdmlzaW9ucyA9IDEwMDAwLCByZWwudG9sID0gdG9sKVsxXQojICAgICAgIENPMmFyZWEgPC0gYXMubnVtZXJpYyh1bmxpc3QoQ08yYXJlYV9pbnQpKQojICAgICAgIGZyYWNwcm9wb3J0aW9uIDwtIENPMmFyZWEgLyB0b3RhbGFyZWFfaW50CiMgICAgICAgZnJhY3Rpb25zIDwtIGMoZnJhY3Rpb25zLCBmcmFjcHJvcG9ydGlvbikKIyAgICAgfSBlbHNlIHsKIyAgICAgICB0ZW1wbG93ZXIgPC0gdGVtcHNbeS0xXQojICAgICAgIENPMmFyZWFfaW50IDwtIGludGVncmF0ZShzcF9mdW4sIHRlbXBsb3dlciwgdGVtcHNbeV0sIHN1YmRpdmlzaW9ucyA9IDgwMDAsIHJlbC50b2wgPSB0b2wpWzFdCiMgICAgICAgQ08yYXJlYSA8LSBhcy5udW1lcmljKHVubGlzdChDTzJhcmVhX2ludCkpCiMgICAgICAgZnJhY3Byb3BvcnRpb24gPC0gQ08yYXJlYSAvIHRvdGFsYXJlYV9pbnQKIyAgICAgICBmcmFjdGlvbnMgPC0gYyhmcmFjdGlvbnMsIGZyYWNwcm9wb3J0aW9uKQojICAgICB9CiMgICB9CiMgICBkYXRhLmZyYW1lKHRlbXBfdSA9IHRlbXBzLCBjX3BjdCA9IGZyYWN0aW9ucyAqIDEwMCkKIyB9CiMgY2ZyYy5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGNzdmxpc3QpLCBmdW5jdGlvbihpKSB7CiMgICBmcmMuZngoY3N2bGlzdFtbaV1dLCAKIyAgICAgICAgICBIRl90bWwudGVtcHMuZGZbZ3JlcChzdWJzdHIobmFtZXMoY3N2bGlzdClbaV0sIDEsIDIpLCBIRl90bWwudGVtcHMuZGYkUE0pLCAidGVtcCJdKQojIH0pCiMgbmFtZXMoY2ZyYy5scykgPC0gbmFtZXMoY3N2bGlzdCkKIyAKIyAjIGdldCBDIGNvbnRlbnQKIyBsYXBwbHkoc2VxX2Fsb25nKGNmcmMubHMpLCBmdW5jdGlvbihpKSB7CiMgICBpZiAoaSA9PSAxKSB7CiMgICAgIHN1bShjZnJjLmxzW1tpXV1bWyJjX3BjdCJdXVs1XSwgY2ZyYy5sc1tbaV1dW1siY19wY3QiXV1bNl0pCiMgICB9IGVsc2UgewojICAgICBjZnJjLmxzW1tpXV1bWyJjX3BjdCJdXVs2XQojICAgfQojIH0pCgojIHVzZSBTaGFuZSdzIGZ1bmN0aW9ucwpzb3VyY2UoIi4vdXRpbGl0aWVzL0ZyYWN0aW9uU2l6ZXMuUiIpCgpBTndmLnRtbC5jLmRpc3QgPC0gRnJhY3Rpb25TaXplcygKICBjc3YgPSBBTndmLjMwLkhGX3RtbCwgCiAgdGVtcHNfaW4gPSBIRl90bWwudGVtcHMuZGZbSEZfdG1sLnRlbXBzLmRmJFBNID09ICJBTiIsICJ0ZW1wIl0pCkJTd2YudG1sLmMuZGlzdCA8LSBGcmFjdGlvblNpemVzKAogIGNzdiA9IEJTd2YuMzAuSEZfdG1sLCAKICB0ZW1wc19pbiA9IEhGX3RtbC50ZW1wcy5kZltIRl90bWwudGVtcHMuZGYkUE0gPT0gIkJTIiwgInRlbXAiXSkKR1J3Zi50bWwuYy5kaXN0IDwtIEZyYWN0aW9uU2l6ZXMoCiAgY3N2ID0gR1J3Zi4zMC5IRl90bWwsIAogIHRlbXBzX2luID0gSEZfdG1sLnRlbXBzLmRmW0hGX3RtbC50ZW1wcy5kZiRQTSA9PSAiR1IiLCAidGVtcCJdKQoKRm1EaXN0LmZ4IDwtIGZ1bmN0aW9uKHNhbXBsZSwgcmFtcCwgRm1UZW1wLCBidWxrRm0pIHsKICAKICAjIGdldCBsZW5ndGgKICBsZW5fcmFtcCA8LSB3aGljaChyYW1wJHRlbXAgPT0gNzc1KQoKICAjIyBHcmFiIG9ubHkgcmVsZXZhbnQgZGF0YSB3aXRoIG5ldyBSUE8gc21vb3RoaW5nIG91dHB1dHMKICByYW1wIDwtIHJhbXBbMTpsZW5fcmFtcCwgXQogIHJhbXAkQ08yX3Byb3AgPSByYW1wJE1vdmluZyAvIG1heChyYW1wJE1vdmluZywgbmEucm0gPSBUUlVFKQoKICAjIyBUaGVybW9ncmFtCiAgIyBUZW1wZXJhdHVyZSByYW1wLCB3aXRoIGludGVydmFscyBmb3IgaW50ZXJwb2xhdGlvbiA9IHJlc28gKGRlZmF1bHQgPSAwLjEpCiAgaHQgPC0gc2VxKDEwMCwgNzc1LCBieSA9IC4xKQogIHJzcCA8LSBzcGxpbmUocmFtcCR0ZW1wLCByYW1wJENPMl9wcm9wLCB4b3V0ID0gaHQpCiAgCiAgIyMgQ2FsY3VsYXRlIHRvdGFsIGFyZWEgdW5kZXIgY3VydmUKICB0b3RBVUMgPC0gQVVDKGh0LCByc3AkeSwgbWV0aG9kID0gJ3NwbGluZScsIHN1YmRpdmlzaW9ucyA9IGxlbmd0aChodCkpCiAgCiAgIyBsb29wCiAgQXJlYSA8LSBodAogIG4gPC0gMQogIGNvbmQgPC0gYyhyZXAoVFJVRSwgbGVuZ3RoKGh0KSAtIDEpLCBGQUxTRSkKICBmb3IgKHQgaW4gaHQpIHsKICAgIGlmIChjb25kW25dKSB7CiAgICAgIEFyZWFbbl0gPC0gQVVDKGh0LCByc3AkeSwgZnJvbSA9IHQsIHRvID0gaHRbbiArIDFdLCBtZXRob2QgPSAnc3BsaW5lJykgLyB0b3RBVUMKICAgIH0gZWxzZSB7CiAgICAgIEFyZWFbbl0gPC0gQVVDKGh0LCByc3AkeSwgZnJvbSA9IHQsIHRvID0gaHRbbl0sIG1ldGhvZCA9ICdzcGxpbmUnKSAvIHRvdEFVQwogICAgfQogICAgCiAgICAjIHVwZGF0ZSBjb3VudGVyCiAgICBuIDwtIG4gKyAxCiAgfQogIAogICMgZ2V0IG5hdHVyYWwgY3ViaWMgc3BsaW5lIGZpdAogIGZtX3NwX25DdWIgPC0gc3BsaW5lKHkgPSBidWxrRm0sIHggPSBGbVRlbXAsIG1ldGhvZCA9ICduYXR1cmFsJywgeG91dCA9IGh0KQogIAogICMgQ3JlYXRlIGRhdGEgZnJhbWUgd2l0aCBuYXR1cmFsIGN1YmljIHNwbGluZSBmaXQKICBkZl9zcCA8LSBkYXRhLmZyYW1lKHRlbXAgPSBodCwgYXJlYSA9IEFyZWEsIGZtX3NwX25DdWIgPSBmbV9zcF9uQ3ViJHkpCiAgCiAgIyBzcGxpbmUgZml0IHN0YXRzCiAgTkN1YnN0YXRzIDwtIGMoCiAgICB3cW50bCA9IEhtaXNjOjp3dGQucXVhbnRpbGUoCiAgICAgIGRmX3NwJGZtX3NwX25DdWIsIAogICAgICB3ZWlnaHRzID0gZGZfc3AkYXJlYSwKICAgICAgbm9ybXd0ID0gVFJVRSwgCiAgICAgIHByb2JzID0gYygwLjEsIDAuMjUsIDAuNSwgMC43NSwgMC45KSksCiAgICB3bWVhbiA9IEhtaXNjOjp3dGQubWVhbigKICAgICAgZGZfc3AkZm1fc3BfbkN1YiwgCiAgICAgIHdlaWdodCA9IGRmX3NwJGFyZWEpKQoKICAjIGdldCBoaXMKICBOQ3ViSGlzdCA8LSBwbG90cml4Ojp3ZWlnaHRlZC5oaXN0KAogICAgZGZfc3AkZm1fc3BfbkN1YiwgCiAgICBkZl9zcCRhcmVhLCAKICAgIGZyZXEgPSBGQUxTRSwKICAgIG1haW4gPSAnTmF0dXJhbCBDdWJpYyBTcGxpbmUsIFdlaWdodGVkJywgCiAgICBicmVha3MgPSBzZXEoZnJvbSA9IG1pbihkZl9zcCRmbV9zcF9uQ3ViKSwgdG8gPSBtYXgoZGZfc3AkZm1fc3BfbkN1YiksIGxlbmd0aC5vdXQgPSAxMDAwKSwgCiAgICBwbG90ID0gRkFMU0UpCiAgCiAgIyByZXR1cm4KICBsaXN0KHN0YXRzID0gZGF0YS5mcmFtZShzYW1wbGUsIE5DdWJzdGF0cyksCiAgICAgICBkZW5zaXR5ID0gZGF0YS5mcmFtZShzYW1wbGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlkRm0gPSBzZXEoZnJvbSA9IDAuMCwgdG8gPSAyLCBsZW5ndGgub3V0ID0gMTAwMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQ3ViID0gYygwLCBOQ3ViSGlzdCRkZW5zaXR5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DdWJEZW5zID0gZGVuc2l0eShOQ3ViSGlzdCRkZW5zaXR5LCBuID0gMTAwMCkkeSksCiAgICAgICBhcmVhID0gZGF0YS5mcmFtZShhcmVhID0gZGZfc3AkYXJlYSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBOQ3ViX0ZtID0gZGZfc3AkZm1fc3BfbkN1YiwKICAgICAgICAgICAgICAgICAgICAgICAgIE5DdWJfMTRjID0gY29udmVydF9mbV9kMTRjKGZtID0gZGZfc3AkZm1fc3BfbkN1YiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic19kYXRlX3kgPSAyMDE5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSkpKQp9CgpBTndmLnRtbC5mbS5kaXN0IDwtIEZtRGlzdC5meCgKICAiQU53ZiIsIAogIHJhbXAgPSBBTndmLjMwLkhGX3RtbCwgCiAgRm1UZW1wID0gQU53Zi50bWwuYy5kaXN0W1sxXV1bWyI1MHRoLVRlbXAiXV1bMjo2XSwKICBidWxrRm0gPSBmcmMuMTRjLmRmW2ZyYy4xNGMuZGYkUE0gPT0gIkFOIiwgImZtIl0pCgpCU3dmLnRtbC5mbS5kaXN0IDwtIEZtRGlzdC5meCgKICAiQlN3ZiIsIAogIHJhbXAgPSBCU3dmLjMwLkhGX3RtbCwgCiAgRm1UZW1wID0gQlN3Zi50bWwuYy5kaXN0W1sxXV1bWyI1MHRoLVRlbXAiXV1bMjo2XSwKICBidWxrRm0gPSBmcmMuMTRjLmRmW2ZyYy4xNGMuZGYkUE0gPT0gIkJTIiwgImZtIl0pCgpHUndmLnRtbC5mbS5kaXN0IDwtIEZtRGlzdC5meCgKICAiR1J3ZiIsIAogIHJhbXAgPSBHUndmLjMwLkhGX3RtbCwgCiAgRm1UZW1wID0gR1J3Zi50bWwuYy5kaXN0W1sxXV1bWyI1MHRoLVRlbXAiXV1bMjo2XSwKICBidWxrRm0gPSBmcmMuMTRjLmRmW2ZyYy4xNGMuZGYkUE0gPT0gIkdSIiwgImZtIl0pCgojIGNvbWJpbmUgYW5kIHBsb3QKeGxpbSA8LSBjb252ZXJ0X2ZtX2QxNGMoCiAgZm0gPSBjKG1pbihBTndmLnRtbC5mbS5kaXN0JHN0YXRzJE5DdWJzdGF0cywKICAgICAgICAgICAgIEJTd2YudG1sLmZtLmRpc3Qkc3RhdHMkTkN1YnN0YXRzLAogICAgICAgICAgICAgR1J3Zi50bWwuZm0uZGlzdCRzdGF0cyROQ3Vic3RhdHMpIC0gLjA0LAogICAgICAgICBtYXgoQU53Zi50bWwuZm0uZGlzdCRzdGF0cyROQ3Vic3RhdHMsCiAgICAgICAgICAgICBCU3dmLnRtbC5mbS5kaXN0JHN0YXRzJE5DdWJzdGF0cywKICAgICAgICAgICAgR1J3Zi50bWwuZm0uZGlzdCRzdGF0cyROQ3Vic3RhdHMpICsgLjA0KSwKICBvYnNfZGF0ZV95ID0gMjAxOSwgdmVyYm9zZSA9IEZBTFNFKQpyYmluZCgKICBkYXRhLmZyYW1lKFBNID0gImFuZGVzaXRlIiwgQU53Zi50bWwuZm0uZGlzdCRhcmVhKSwKICBkYXRhLmZyYW1lKFBNID0gImJhc2FsdCIsIEJTd2YudG1sLmZtLmRpc3QkYXJlYSksCiAgZGF0YS5mcmFtZShQTSA9ICJncmFuaXRlIiwgR1J3Zi50bWwuZm0uZGlzdCRhcmVhKSkgJT4lCiAgZ2dwbG90KC4pICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9kZW5zaXR5KGFlcyh4ID0gTkN1Yl8xNGMsIHkgPSAuLmRlbnNpdHkuLiwgd2VpZ2h0ID0gYWJzKGFyZWEpLCAKICAgICAgICAgICAgICAgICAgIGZpbGwgPSBQTSwgY29sb3IgPSBQTSksIGFscGhhID0gLjYpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKICB4bGltKHhsaW0pICsKICB4bGFiKGV4cHJlc3Npb24oJ0Mtd2VpZ2h0ZWQgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArIAogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3IgcGxvdC10bWwtYy1mcmN9CiMgYmluZF9yb3dzKAojICAgbGFwcGx5KGNmcmMubHMsIGZ1bmN0aW9uKHgpIHsKIyAgICAgdDAgPC0geFsxLCBdCiMgICAgIHQwJHRlbXBfdSA8LSAwCiMgICAgIG5fbmV3IDwtIHJiaW5kKHQwLCB4KQojICAgICBuX25ldyRjX3BjdCA8LSBjKHgkY19wY3QsIHgkY19wY3RbbnJvdyh4KV0pCiMgICAgIHJldHVybihuX25ldykKIyAgIH0pLCAuaWQgPSAiUE1lY28iKSAlPiUKIyAgIGdncGxvdCguLCBhZXModGVtcF91LCBjX3BjdCwgY29sb3IgPSBQTWVjbykpICsKIyAgIGdlb21fc3RlcCgpICsKIyAgICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSBOVUxMLAojICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU53ZiIgPSBhbmRlc2l0ZSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTd2YiID0gYmFzYWx0LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1J3ZiIgPSBncmFuaXRlKSwKIyAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOd2YiID0gImFuZGVzaXRlLCBjb29sIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTd2YiID0gImJhc2FsdCwgY29vbCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUndmIiA9ICJncmFuaXRlLCBjb29sIikpICsKIyAgIHlsYWIoIiUgQyIpICsKIyAgIHhsYWIoIlRlbXBlcmF0dXJlIikgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyIGMtd3RkLXRtbC0xNGN9CiMgY2ZyYy5sczIgPC0gbGFwcGx5KHNlcV9hbG9uZyhjZnJjLmxzKSwgZnVuY3Rpb24oaSkgewojICAgZGYgPC0gY2ZyYy5sc1tbaV1dWzI6bnJvdyhjZnJjLmxzW1tpXV0pLCBdCiMgICBkZiAlPiUKIyAgICAgbXV0YXRlKGNfcGN0ID0gY19wY3QgKiAxMF4tMiwKIyAgICAgICAgICAgIHRobWxfZnJjID0gc2VxKDEsIG5yb3coLikpLAojICAgICAgICAgICAgUE1lY28gPSBuYW1lcyhjZnJjLmxzKVtpXSwKIyAgICAgICAgICAgIFBNID0gc3Vic3RyKFBNZWNvLCAxLCAyKSwKIyAgICAgICAgICAgIEVDTyA9IHN1YnN0cihQTWVjbywgMywgNCkpCiMgfSkKIyBmcmMuMTRjLnd0ZC5kZiA8LSBtZXJnZShmcmMuMTRjLmRmLCBiaW5kX3Jvd3MoY2ZyYy5sczIpKSAlPiUKIyAgIG11dGF0ZShkMTRjX3d0ZCA9IGQxNGMgKiBjX3BjdCkKIyAKIyAjIHN0ZXAtcGxvdAojIGZyYy4xNGMud3RkLmRmICU+JQojICAgZmlsdGVyKHRobWxfZnJjID09IDUpICU+JQojICAgbXV0YXRlKHRobWxfZnJjID0gNikgJT4lCiMgICByYmluZChmcmMuMTRjLnd0ZC5kZiwgLikgJT4lCiMgICBnZ3Bsb3QoLiwgYWVzKHRobWxfZnJjLCBkMTRjX3d0ZCwgY29sb3IgPSBQTSkpICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKIyAgIGdlb21fc3RlcCgpICsKIyAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gTlVMTCwKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSBhbmRlc2l0ZSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSBiYXNhbHQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gZ3Jhbml0ZSksCiMgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpKSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDEuNSwgNS41KSwgbGFiZWxzID0gYXMuY2hhcmFjdGVyKHNlcSgxLCA1KSkpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignQyB3ZWlnaHRlZCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIHhsYWIoIlRoZXJtYWwgZnJhY3Rpb24iKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCiMgCiMgIyBjdW11bGF0aXZlIEMgcGxvdHMKIyBmcmMuMTRjLnd0ZC5jbXR2LmRmIDwtIGJpbmRfcm93cygKIyAgIGxhcHBseShzcGxpdChmcmMuMTRjLnd0ZC5kZiwgZnJjLjE0Yy53dGQuZGYkUE1lY28pLCBmdW5jdGlvbih4KSB7CiMgICAgICMgeCAgPC0geFtvcmRlcih4JGQxNGMpLCBdICMgdG8gb3JkZXIgYnkgZDE0YwojICAgICBmb3IgKGkgaW4gMTpucm93KHgpKSB7CiMgICAgICAgaWYgKGkgPT0gMSkgewojICAgICAgICAgeCRjbXR2X2NbaV0gPC0geCRjX3BjdFtpXSAqIDEwMAojICAgICAgICAgeCR4bWluW2ldIDwtIDAKIyAgICAgICB9IGVsc2UgewojICAgICAgICAgeCRjbXR2X2NbaV0gPC0geCRjX3BjdFtpXSAqIDEwMCArIHgkY210dl9jW2kgLSAxXQojICAgICAgICAgeCR4bWluW2ldIDwtIHgkY210dl9jW2kgLSAxXQojICAgICAgIH0KIyAgICAgfQojICAgICB4JHN5bl8xNGMgPC0gc3VtKHgkZDE0Y193dGQpCiMgICAgIHJldHVybih4KQojICAgfSkKIyApCiMgCiMgIyBsYWJlbCBmYWNldHMKIyBmX2xhYnMgPC0gZGF0YS5mcmFtZShjbXR2X2MgPSAxLCBkMTRjID0gLTE0NSwgCiMgICAgICAgICAgICAgICAgICAgICAgUE0gPSBjKCJBTiIsICJCUyIsICJHUiIpLAojICAgICAgICAgICAgICAgICAgICAgIG1pbkNfMTRjID0gcm91bmQodW5pcXVlKGZyYy4xNGMud3RkLmNtdHYuZGYkc3luXzE0YyksIDApKQojIGZfbGFicyRsYWJlbCA8LSBwYXN0ZTAobGV0dGVyc1sxOjNdLCAiKSAiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgIGMoImFuZGVzaXRlID0gIiwgImJhc2FsdCA9ICIsICJncmFuaXRlID0gIiksIAojICAgICAgICAgICAgICAgICAgICAgICBmX2xhYnMkbWluQ18xNGMsICLigLAiKQojICAgICAgICAgICAgICAgICAgIAojIAojICMgY29sLXBsb3QKIyBmcmMuMTRjLnd0ZC5jbXR2LmRmICU+JQojICAgIyBtdXRhdGUobm9ybV8xNGMgPSBkMTRjIC0gc3luXzE0YykgJT4lCiMgICBnZ3Bsb3QoLiwgYWVzKGNtdHZfYywgZDE0YykpICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKIyAgIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSBjbXR2X2MsIAojICAgICAgICAgICAgICAgICB5bWluID0gMCwgeW1heCA9IGQxNGMsCiMgICAgICAgICAgICAgICAgIGZpbGwgPSBQTSwgYWxwaGEgPSB0ZW1wX3UpLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAuMykgKwojICAgZ2VvbV90ZXh0KGRhdGEgPSBmX2xhYnMsIGFlcyhsYWJlbCA9IGxhYmVsKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwKIyAgIHNpemUgPSAuMzYgKiAxMiwgZm9udGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gImxlZnQiKSArCiMgICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gYW5kZXNpdGUsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpLAojICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSkgKwojICAgc2NhbGVfYWxwaGFfY29udGludW91cyhuYW1lID0gIlRlbXBlcmF0dXJlICjCsEMpIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygyNTAsIDM1MCwgNTAwLCA4MDApLAojICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDE1MCwgODAwKSwgcmFuZ2UgPSBjKDAsIDEpKSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxMDApLCBleHBhbmQgPSBjKDAuMDEsIDAuMDEpKSArCiMgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKFBNKSkgKwojICAgeWxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIHhsYWIoIlBlcmNlbnQgb2YgdG90YWwgbWluZXJhbC1hc3NvY2lhdGVkIEMiKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJ3aGl0ZSIpLAojICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiMgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAojICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCiMgCiMgIyBhcyBzdGVwcwojIGJpbmRfcm93cygKIyAgIGxhcHBseShzcGxpdChmcmMuMTRjLnd0ZC5jbXR2LmRmLCBmcmMuMTRjLnd0ZC5jbXR2LmRmJFBNZWNvKSwgZnVuY3Rpb24oeCkgewojICAgICB4X2VuZCA8LSB4W25yb3coeCksIF0KIyAgICAgeF9lbmQkeG1pbiA8LSAxMDAKIyAgICAgcmJpbmQoeCwgeF9lbmQpCiMgICB9KSkgJT4lCiMgICBnZ3Bsb3QoLiwgYWVzKHhtaW4sIGQxNGMsIGNvbG9yID0gUE0pKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX3N0ZXAoc2l6ZSA9IDEpICsKIyAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gYW5kZXNpdGUsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpLAojICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSkgKwojICAgc2NhbGVfYWxwaGFfY29udGludW91cyhuYW1lID0gIlRlbXBlcmF0dXJlICjCsEMpIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygyNTAsIDM1MCwgNTAwLCA4MDApLAojICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDE1MCwgODAwKSwgcmFuZ2UgPSBjKDAsIDEpKSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxMDApLCBleHBhbmQgPSBjKDAuMDEsIDAuMDEpKSArCiMgICB5bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgeGxhYigiUGVyY2VudCBvZiB0b3RhbCBtaW5lcmFsLWFzc29jaWF0ZWQgQyIpICsKIyAgIHRoZW1lX2J3KCkgKwojICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAojICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAojICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKIyAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpKQpgYGA=